java - J2ME 从文件中读取内容

标签 java file-io java-me midp file-connection

我正在尝试读取文件的内容,但它似乎不起作用。我在网上冲浪并发现了不同的实现,如图所示(read(),read2(),readLine())但是每次运行代码时它们都会给出 NullPointer 异常。请问我该怎么做才能解决这个问题。

     private String folder;
        static String filename;
        //IMPLEMENTATION 1
        private void readFile(String f) {
            try {
                InputStreamReader reader = new InputStreamReader(getClass().getResourceAsStream(f));
                String line = null;
                while ((line = readLine(reader)) != null) {
                    System.out.println(line);
                }
                reader.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
/**
         * Reads a single line using the specified reader.
         * @throws java.io.IOException if an exception occurs when reading the
         * line
         */
        private String readLine(InputStreamReader reader) throws IOException {
            // Test whether the end of file has been reached. If so, return null.
            int readChar = reader.read();
            if (readChar == -1) {
                return null;
            }
            StringBuffer string = new StringBuffer("");
            // Read until end of file or new line
            while (readChar != -1 && readChar != '\n') {
                if (readChar != '\r') {
                    string.append((char) readChar);
                }
                // Read the next character
                readChar = reader.read();
            }
            return string.toString();
        }

        //IMPLEMENTATION 2
        private String read(String file) throws IOException {
            InputStream is = getClass().getResourceAsStream(file);
            StringBuffer sb = new StringBuffer();
            int chars, i = 0;
            while ((chars = is.read()) != -1) {
                sb.append((char) chars);
            }
            return sb.toString();
        }

        //IMPLEMENTATION 3
        private String read2(String file) throws IOException {
            String content = "";
            Reader in = new InputStreamReader(this.getClass().getResourceAsStream(file));
            StringBuffer temp = new StringBuffer(1024);
            char[] buffer = new char[1024];
            int read;
            while ((read = in.read(buffer, 0, buffer.length)) != -1) {
                temp.append(buffer, 0, read);
            }
            content = temp.toString();
                    return content;
        }

        public void execute() throws IOException {
            folder = System.getProperty("fileconn.dir.photos") + "mcast/";
            String path = folder + filename + ".txt";
            FileConnection c = (FileConnection) Connector.open(path, Connector.READ_WRITE);

            try {
                // Checking if the directoy exists or not. If it doesn't exist we create it.
                if (c.exists()) {
            readFile(path);
                    //read(path);
                   // read2(path);
                    System.out.println(read(path));
                } else {
                    System.out.println(filename + ".txt does not exist. Please specify a correct file name");
                }
            } finally {
                c.close();
            }
        }

private String readLine(InputStreamReader reader) throws IOException {
        // Test whether the end of file has been reached. If so, return null.
        int readChar = reader.read();
        if (readChar == -1) {
            return null;
        }
        StringBuffer string = new StringBuffer("");
        // Read until end of file or new line
        while (readChar != -1 && readChar != '\n') {
            // Append the read character to the string. Some operating systems
            // such as Microsoft Windows prepend newline character ('\n') with
            // carriage return ('\r'). This is part of the newline character
            // and therefore an exception that should not be appended to the
            // string.
            if (readChar != '\r') {
                string.append((char) readChar);
            }
            // Read the next character
            readChar = reader.read();
        }
        return string.toString();
    }


    }

最佳答案

问题:使用不正确的方法引用文件

getResourceAsStream(...)用于从二进制包 (.jar) 或类路径目录中的类路径加载资源。

所以它的本质意思是,使用 getClass().getResourceAsStream() 从二进制包读取文件,使用 FileConnection API 从设备的物理内存读取文件。

您正在尝试从 FileConnection 中使用的类型的文件模式创建输入流,因此它不会工作。因此,为了解决您的问题,您已经替换了 read(...)read2(...)readFile(... ) 使用以下代码

InputStreamReader reader = new InputStreamReader(in); //这里in是InputStream类型的方法入参

并在 execute(...) 中传递文件连接输入流,如下所示

readFile(c.openInputStream()); //这里c是FileConnection类型的对象

.

如果您在模拟器/设备中测试您的应用程序,您可能还需要考虑这些

  1. 确保 System.getProperty("fileconn.dir.photos") 返回 NON NULL
  2. 文件存储在系统中的适当位置

关于java - J2ME 从文件中读取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8473382/

相关文章:

c - 对这种行为有什么解释吗?

java - 在j2me lwuit中,使用主题组合框下拉,其他组件将隐藏

java - 无法从文件中读取多个对象

C++ 命名管道 WriteFileEx/ReadFile, unicode/ansi

java - 为什么我的 JComboBox 数组没有更新?

file - 使用 r+ 模式打开文件时如何删除文件内容?

java - 为什么我不能在 j2me 中使用多态性?

java - J2ME 与 java 1.6

java - jar 文件可以在运行时重命名或删除自身吗?

java - 从 GPS 跟踪器读取未记录的数据