【问题标题】:how to read a .txt file with BufferedInputStreamReader如何使用 BufferedInputStreamReader 读取 .txt 文件
【发布时间】:2014-09-21 03:03:00
【问题描述】:

我认为,问题在于文件 jar 中,这似乎使它更难了一些。

我不明白如何在从本地文件(在 jar 中)读取时实例化 InputStreamReader,如下所示:

package net.bounceme.dur.client;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Template {

    private static final Logger log = Logger.getLogger(Template.class.getName());
    StringBuffer buffer = new StringBuffer();

    public Template() {
    }

    public String getTemplate() {
        return buffer.toString();
    }

    public void load() {
//        try (BufferedInputStream input = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream("template.txt"))) {
        try (BufferedInputStream input = new BufferedInputStream(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("template.txt")),"UTF-8")) {
            int data = input.read();
            while (data != -1) {
                buffer.append((char) data);
                data = input.read();

            }
        } catch (IOException ex) {
            Logger.getLogger(Template.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

编译错误(语法错误):

-do-compile:
    [mkdir] Created dir: /home/thufir/NetBeansProjects/Mail/build/empty
    [mkdir] Created dir: /home/thufir/NetBeansProjects/Mail/build/generated-sources/ap-source-output
    [javac] Compiling 14 source files to /home/thufir/NetBeansProjects/Mail/build/classes
    [javac] /home/thufir/NetBeansProjects/Mail/src/net/bounceme/dur/client/Template.java:23: error: no suitable constructor found for BufferedInputStream(InputStreamReader,String)
    [javac]         try (BufferedInputStream input = new BufferedInputStream(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("template.txt")),"UTF-8")) {
    [javac]                                          ^
    [javac]     constructor BufferedInputStream.BufferedInputStream(InputStream,int) is not applicable
    [javac]       (actual argument InputStreamReader cannot be converted to InputStream by method invocation conversion)
    [javac]     constructor BufferedInputStream.BufferedInputStream(InputStream) is not applicable
    [javac]       (actual and formal argument lists differ in length)
    [javac] Note: /home/thufir/NetBeansProjects/Mail/src/net/bounceme/dur/client/gui/MailGUI.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 1 error

BUILD FAILED
/home/thufir/NetBeansProjects/Mail/nbproject/build-impl.xml:924: The following error occurred while executing this line:
/home/thufir/NetBeansProjects/Mail/nbproject/build-impl.xml:264: Compile failed; see the compiler error output for details.

Total time: 3 seconds
thufir@dur:~/NetBeansProjects/Mail$ 

对于hovereel,结构:

thufir@dur:~/NetBeansProjects/Mail$ 
thufir@dur:~/NetBeansProjects/Mail$ tree src/
src/
├── client.properties
├── logging.properties
├── META-INF
│   └── persistence.xml
├── net
│   └── bounceme
│       └── dur
│           └── client
│               ├── gui
│               │   ├── ApplicationDriver.java
│               │   ├── Goof.form
│               │   ├── Goof.java
│               │   ├── MailGUI.form
│               │   ├── MailGUI.java
│               │   └── TitleBuilder.java
│               ├── jdbc
│               │   ├── Agents.java
│               │   ├── Provinces.java
│               │   ├── State.java
│               │   ├── TitleException.java
│               │   ├── TitleFactory.java
│               │   └── Title.java
│               ├── MyProps.java
│               ├── NewJFrame.form
│               ├── NewJFrame.java
│               ├── SendTLS.java
│               └── Template.java
└── template.txt

7 directories, 21 files
thufir@dur:~/NetBeansProjects/Mail$ 

【问题讨论】:

  • 你能展示一下你的jar文件的结构吗?
  • 嘿,暂时没有——不会编译!我会的。它在“顶部”,这种语法可以读取文件,路径是正确的。它在带有属性文件的默认包中。我添加了一个 src 的树形视图来显示路径。

标签: java utf-8 io inputstream bufferedinputstream


【解决方案1】:

我想你想要类似的东西

try (BufferedInputStream input = new BufferedInputStream(
    getClass().getClassLoader().getResourceAsStream("template.txt"))) {

}

因为只有两个构造函数,每个BufferedInputStream Javadoc

BufferedInputStream(InputStream in)
     Creates a BufferedInputStream and saves its argument, the input stream in, 
     for later use.
BufferedInputStream(InputStream in, int size)
     Creates a BufferedInputStream with the specified buffer size, and saves 
     its argument, the input stream in, for later use.

两者都不需要InputStreamReader。你当然可以把上面的BufferedInputStream用一个包裹起来,

try (BufferedInputStream bis = new BufferedInputStream(
    getClass().getClassLoader().getResourceAsStream("template.txt"))) {
  InputStreamReader input = new InputStreamReader(bis, "UTF-8");
}

【讨论】:

  • 只有当您的平台的本机编码是 utf8 时,第一个才会。第一个示例将BufferedInputStream 包裹在InputStream 周围,getResourceAsStream(String) 返回。
【解决方案2】:

啊,我明白了,您试图将 Reader 传递给 BufferedInputStream,这是不允许的,因为 BufferedInputStream 只接受 InputStream 参数,而不接受 Reader。您也没有向我们显示编译错误消息。相反,要么走 Elliott 的路线 (1+),要么将 InputStream 传递到 BufferedReader 而不是 BufferedInputStream。

【讨论】:

  • 对不起,编译错误?不确定您的意思或需要。
  • 其实是在post 编译错误(语法错误)。可能是五分钟的编辑。
  • @ElliottFrisch:这让我很困惑。 “错误的语法”意义不大,极不具描述性,表明缺少更多错误消息。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多