Java中无论是将什么样的数据写入到文本文件中,都需要使用IO流去操作,我们需要使用java.io包中的类去实现,其中最重要的五个类是File、OutputStream、InputStream、Writer、Reader,我们使用OutputStream、InputStream实现字节的输入和输出操作,使用Writer、Reader去实现字符的输入和输出操作。这两组类均为抽象类,可以根据使用场景的不同使用不同的实现类。

工具/原料

  • IntelliJ IDEA

方法/步骤

  1. 1

    Java中我们使用流进行数据传输,就好像在数据源和目的之间建立了一条传输管道,我们可以想象一下就像水管一样。IO流根据处理数据的类型不同分为字符流和字节流,根据数据的流向不同可以分为输入流和输出流。IO流的分类可以参考下图,我们将在接下来使用这里面的类。

  2. 2

    接下来我们创建一个TxtUtil工具类,来实现写入文本文件的方法。下面这个方法是将数据追加写入到文件文件的末尾,我们可以看到该方法有两个参数,List<String>就是我们要写入的数据,因此不管是什么格式的数据我们都需要转成List<String>写入,fileName是我们要写入的文件名,如果这个文件不存在的话,下面的方法中new File(fileName)会帮我们创建。以下便是使用输出了将数据写入到文件的代码,注意流在使用后一定要关闭。

    /**   * 数据追加写到文件末尾   *   * @param dataList   * @param fileName   * @return   */public static void appendData2File(List<String> dataList, String fileName)  {      OutputStreamWriter out = null;      FileOutputStream fos = null;      try {          File file = new File(fileName);          if (!file.getParentFile().isDirectory()) {              file.getParentFile().mkdirs();          }          if (!file.exists()) {              file.createNewFile();          }        // 追加写入文件,且使用UTF-8格式          fos = new FileOutputStream(fileName, true);          out = new OutputStreamWriter(fos, "UTF-8");          for (int dataIndex = 0; dataIndex < dataList.size(); dataIndex++) {              out.write(dataList.get(dataIndex));              out.write("\r\n");          }      } catch (Exception e) {      } finally {          try {              if (null != out) {                  out.flush();                  out.close();                  fos.close();              }          } catch (IOException e) {          }      }  }  

  3. 3

    我们在持续写入文本文件时也需要去判断文件的大小,如果文件过大的话,即便文件写入成功,打开也要等待很长时间,因此该方法还是很有必要的。

    /**   * 根据java.nio.*的流获取文件大小   * @param file   */  public static long getFileSize(File file){      FileChannel fc = null;      try {          if(file.exists() && file.isFile()){              FileInputStream fis = new FileInputStream(file);              fc = fis.getChannel();              return fc.size();          }      } catch (Exception e) {          e.printStackTrace();      }finally{          if(null!=fc){              try {                  fc.close();              } catch (IOException e) {                  e.printStackTrace();              }          }      }      return 0;  }  

  4. 4

    工具类已经写完了,接下来便是如何将HashMap类型的数据写入到文本文件。我们创建一个Test类,在main方法中创建HashMap,并且放入一些测试数据,将HashMap中的数据转成工具类中需要的List<String>类型,然后调用工具类中的方法将数据写入文件,最后打印文件的大小。

    public static void main(String[] args) {    Map<String, Object> map = new HashMap<>();    map.put("桃子", 10);    map.put("香蕉", 8);    map.put("西瓜", 6);    List<String> list = new ArrayList<>();    // 遍历HashMap将数据转为List<String>    for(Map.Entry<String, Object> entry : map.entrySet()) {        StringBuilder s = new StringBuilder();        s.append(entry.getKey())                .append(entry.getValue()).append("元");        list.add(s.toString());    }    // 将数据写入到文本文件    String fileName = "E:/test.txt";    TxtUtil.appendData2File(list, fileName);    long fileLength = TxtUtil.getFileSize(            new File(fileName));    System.out.println(fileLength);}

  5. 5

    运行上面的测试类,我们可以看到在E盘生成了test.txt文件,我们打开该文件可以看到数据已经成功写入了,同时控制台也打印输出了文件的大小,如下图所示。

    END

注意事项

  • 注意在写入文件时如果文件或文件所在的目录没有创建,代码中一定要创建。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。