读取.csv文件时java.io.FileNotFoundException

读取.csv文件时java.io.FileNotFoundException,java,applet,java-io,filenotfoundexception,Java,Applet,Java Io,Filenotfoundexception,我应该创建一个java小程序项目,在这个项目中,我需要从.csv文件中读取数据,并将其放入一个可滚动的表中。我试着这么做,结果得到一个FileNotFoundException 这是我的密码: import java.applet.Applet; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import ja

我应该创建一个java小程序项目,在这个项目中,我需要从.csv文件中读取数据,并将其放入一个可滚动的表中。我试着这么做,结果得到一个FileNotFoundException

这是我的密码:

import java.applet.Applet;
import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

@SuppressWarnings("serial")
public class Test extends Applet
{  
   Table table;
   public void init()
   {
      try
      {
         table = new Table();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
      this.add(table);
   }
}



class Table extends JPanel
{
   private String[][] productList;
   private JTable table;

   public Table() throws Exception
   {
      read();
      BorderLayout layout = new BorderLayout();
      layout.addLayoutComponent(new JScrollPane(table), BorderLayout.CENTER);

      setLayout(layout);
   }

   private void read() throws Exception
   {
      ArrayList<String[]> list = new ArrayList<String[]>();
      try
      {
         BufferedReader br = new BufferedReader(new FileReader("Products.csv"));
         String line = br.readLine();

         while ((line = br.readLine()) != null)
         {
            String[] toBeAdded = line.split(",");
            list.add(toBeAdded);
         }
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }

      productList = new String[list.size()][3];
      for (int i = 0; i < productList.length; i++)
         for (int j = 0; j < productList[i].length; j++)
            productList[i][j] = list.get(i)[j];
   }
}
import java.applet.applet;
导入java.awt.BorderLayout;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.util.ArrayList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
@抑制警告(“串行”)
公共类测试扩展Applet
{  
表格;
公共void init()
{
尝试
{
table=新表();
}
捕获(例外e)
{
e、 printStackTrace();
}
增加(表);
}
}
类表扩展了JPanel
{
私有字符串[][]productList;
专用JTable表;
public Table()引发异常
{
read();
BorderLayout=新的BorderLayout();
addLayoutComponent(新的JScrollPane(表),BorderLayout.CENTER);
设置布局(布局);
}
私有void read()引发异常
{
ArrayList=新建ArrayList();
尝试
{
BufferedReader br=新的BufferedReader(新文件阅读器(“Products.csv”);
String line=br.readLine();
而((line=br.readLine())!=null)
{
字符串[]tobeaded=line.split(“,”);
列表。添加(带标题);
}
}
捕获(例外e)
{
e、 printStackTrace();
}
productList=新字符串[list.size()][3];
for(int i=0;i

products.csv位于根文件夹中。我试着在一个普通的非swing项目中阅读,它是有效的,但不适用于这个项目。有人能帮我吗

我能想到两个潜在的问题:

  • 小程序无法读取位于web服务器上的文件
  • 如果文件打包在jar文件中,则需要特殊代码才能读取它。具体来说,您需要类加载器的getResourceAsStream
  • 对于第二种方法,获取
    ClassLoader
    getResourceAsStream
    的最简单方法是调用
    Class

    我还没有测试过,但类似的东西应该可以工作:

    BufferedReader br = new BufferedReader(new InputStreamReader(Table.class.getResourceAsStream("/Products.csv")));
    
    如果无法编译,请将
    Table.class
    更改为
    this.getClass()


    请注意,
    /
    表示Products.csv位于.jar文件的根目录下。否则,它将使用包名作为目录进行查找(即,如果包是
    package this.is.my.boomstick;
    ,它将尝试打开
    this/is/my/boomstick/Products.csv

    我尝试过,它说没有这样的构造函数BufferedReader(InputStream)@HridayamBakshi对,我错了。。。您需要先将其包装在InputStreamReader中。。。我马上就搞定我的答案。编辑:现在应该修复。它正在抛出NullPointerException“它正在抛出NullPointerException”您似乎将此问答网站误认为是帮助台。如果需要,请问一个新问题。@andreThompson好吧,NPE很可能是因为Table.class.getResourceAsStream没有找到有问题的文件,这意味着这个答案在某种形式上是错误的。