如何解决如何从参数中的文件加载数据并将其作为Java中的列表返回?
我正在尝试从参数中的“ feedsfile”加载数据,并将其作为列表返回。到目前为止,我已通过.add方法将“ feedsfile”添加到列表“ loadFeed”中,并使用扫描仪进行了尝试,但这似乎不起作用。
它说:“列表类型中的add(Feed)方法不适用于参数(文件)。”
@Override
public List<Feed> loadSubscribedFeeds(File feedsFile) {
List<Feed> loadFeed = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(feedsFile))) {
while (s.hasNext()) {
loadFeed.add(feedsFile);
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
return loadFeed;
}
这是Feed类
package de.uk.java.feader.data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
import de.uk.java.feader.utils.FeaderUtils;
public class Feed implements Serializable,Comparable<Feed> {
private static final long serialVersionUID = 1L;
private String url;
private String title;
private String description;
private String publishedDateString;
private List<Entry> entries;
public Feed(String url) {
super();
this.url = url;
this.entries = new ArrayList<Entry>();
this.title = "";
this.description = "";
this.publishedDateString = "";
}
/**
* Creates an instance of a Feed and transfers the feed
* data form a SyndFeed object to the new instance.
* @param url The URL string of this feed
* @param sourceFeed The SyndFeed object holding the data for this feed instance
*/
public Feed(String url,SyndFeed sourceFeed) {
this(url);
setTitle(sourceFeed.getTitle());
setDescription(sourceFeed.getDescription());
if (sourceFeed.getPublishedDate() != null)
setPublishedDateString(FeaderUtils.DATE_FORMAT.format(sourceFeed.getPublishedDate()));
for (SyndEntry entryTemp : sourceFeed.getEntries()) {
Entry entry = new Entry(entryTemp.getTitle());
entry.setContent(entryTemp.getDescription().getValue());
entry.setLinkUrl(entryTemp.getLink());
entry.setParentFeedTitle(getTitle());
if (entryTemp.getPublishedDate() != null) {
entry.setPublishedDateString(FeaderUtils.DATE_FORMAT.format(entryTemp.getPublishedDate()));
}
addEntry(entry);
}
}
public String getUrl() {
return url;
}
public void setTitle(String title) {
this.title = title != null ? title : "";
}
public String getTitle() {
return title;
}
public void setDescription(String description) {
this.description = description != null ? description : "";
}
public String getDescription() {
return description;
}
public void setPublishedDateString(String publishedDateString) {
this.publishedDateString = publishedDateString != null ? publishedDateString : "";
}
public String getPublishedDateString() {
return publishedDateString;
}
/**
* Returns a short string containing a combination of meta data for this feed
* @return info string
*/
public String getShortFeedInfo() {
return getTitle() + " [" +
getEntriesCount() + " entries]: " +
getDescription() +
(getPublishedDateString() != null && getPublishedDateString().length() > 0
? " (updated " + getPublishedDateString() + ")"
: "");
}
public void addEntry(Entry entry) {
if (entry != null) entries.add(entry);
}
public List<Entry> getEntries() {
return entries;
}
public int getEntriesCount() {
return entries.size();
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Feed)
&& ((Feed)obj).getUrl().equals(url);
}
@Override
public int hashCode() {
return url.hashCode();
}
@Override
public String toString() {
return getTitle();
}
@Override
public int compareTo(Feed o) {
return getPublishedDateString().compareTo(o.getPublishedDateString());
}
}
解决方法
问题所在处loadFeed.add(feedsFile)...您没有使用扫描仪进行读取。
尝试一下
While(s.hasNextLine()){
loadFeed.add(s.nextLine());
}
,
如果读取文件返回的对象是String,为什么要尝试从文件feed
中加载对象?该列表应包含字符串而不是提要对象。
您可能需要将文件内容转换为真实对象,看看how to convert a String to Object in JAVA
尝试此操作或类似方法:
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.util.stream.Collectors;
@Override
public List < Feed > loadSubscribedFeeds(File feedsFile) {
List < String > list = Files.lines(Paths.get(feedsFile.getAbsolutePath()),StandardCharsets.ISO_8859_1).collect(Collectors.toList());
List < Object > objs = new ArrayList < >();
try {
for (String s: list)
objs.add(Class.forName(s).newInstance());
//IMPORTANT! s should contain not only feed for example but com.mypackage.feed
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
List < Feed > listFeed = new ArrayList < >();
for (Object l: objs) {
if (l instanceof Feed)
listFeed.add((Feed) l);
}
return listFeed;
}
如果只需要文件内容的字符串表示形式而不是实际对象,请考虑将返回类型更改为List<String>
并返回list
,您已经完成了。而且,如果您想继续使用代码从文件中读取字符串(而不是像我那样使用lambda),请像已经建议的那样使用nextLine
(和hasNextLine()
),并更改{{1} }到List<Feed>
。
使用您已经编写的内容的完整代码如下:
List<String>
其中文件包含的内容类似于:
public List<Feed> loadSubscribedFeeds(File feedsFile) throws IOException {
List<String> list = new ArrayList<>();
try (Scanner s = new Scanner(new FileReader(feedsFile))) {
while (s.hasNextLine()) {
list.add(s.nextLine());
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
List<Object> objs = new ArrayList<>();
try {
for (String s : list)
objs.add(Class.forName(s).newInstance());
//IMPORTANT! s should contain not only feed for example but com.mypackage.feed
}catch(Exception ex){
System.out.println(ex.getMessage());
}
List<Feed> listFeed = new ArrayList<>();
for (Object l : objs){
if (l instanceof Feed)
listFeed.add((Feed)l);
}
return listFeed;
}
对于Subfeed,Feed的子类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。