在Java中,如何从参数中的文件加载数据并将其作为List返回



我正在尝试从"feedsfile";并将其作为List返回。到目前为止,我用扫描仪尝试了一下;feedsfile";加入列表";loadFeed";使用.add方法,但似乎不起作用。

上面写着:;类型List中的add(Feed(方法不适用于参数(File(";。

@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;
}

这是饲料类

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对象?列表应包含字符串,而不是提要对象。您可能需要将文件的内容转换为实际对象。看看如何在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,这样就完成了。如果您想继续使用代码从文件中读取字符串(而不是像我那样使用lambdas(,请像前面建议的那样使用nextLine(和hasNextLine()(,并将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;
}

其中文件包含类似以下内容:

mypackage.Feed
mypackage.Subfeed
//and so on...

Subfeed是feed的一个子类。