【问题标题】:java.io.FileNotFoundException when reading .csv file读取 .csv 文件时出现 java.io.FileNotFoundException
【发布时间】:2014-12-28 08:44:15
【问题描述】:

我应该创建一个 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];
   }
}

products.csv 位于根文件夹中。我尝试阅读一个正常的非摇摆项目,它可以工作,但不适用于这个。谁能帮我?

【问题讨论】:

    标签: java applet java-io filenotfoundexception


    【解决方案1】:

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

    1. 小程序无法读取位于 Web 服务器上的文件。
    2. 如果文件打包在 jar 文件中,则需要特殊代码才能读取它。具体来说,您需要一个 ClassLoader 的 getResourceAsStream。

    其次,获取ClassLoadergetResourceAsStream 的最简单方法是调用ClassgetResourceAsStream

    我还没有测试过,但是这样的东西应该可以工作:

    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” 您似乎将此问答网站误认为是帮助台。请accept the answer 并在需要时提出新问题。
    • @AndrewThompson 嗯,NPE 很可能是因为 Table.class.getResourceAsStream 没有找到有问题的文件,这意味着这个答案在某种程度上是错误的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多