编码技巧——JDK版本切换/JDK7和JDK6下的文件输入输入

最近有使用低版本JDK实现文件输入输出的需求,主要是妹子计算机专业考研复试上级算法题,输入输入依赖文件而非纯算法代码,并且IDE一般使用JDK8以下的SDK,导致一些JDK8的API不适用;

较早版本的JDK API代码是操作一大堆的缓冲区Buffer和输入输出流InputStream/OutputStream,代码较为复杂,不利于上机演示,因此帮整理下JDK7/JDK6下较为简洁的文件输入输出代码;

JDK环境配置

为了验证使用的代码能在JDK7/JDK6下能编译成功并正常运行,这里介绍下配置JDK版本的方法;

IDEA

以下是IDEA下的配置方法;

  • 从File->Project Structure入口进入,先设置Project的全局SDK版本和对应的Language Level;

  • 再选择当前module,设置对应的Language Level;

  • 再从Dependencies进入选择Module SDK版本;

补充:如果再切换回JDK8后提示"Information:java: javacTask: 源发行版 8 需要目标发行版 1.8"检查以下配置;

Eclipse

以下是IDEA下的配置方法;

扫描二维码关注公众号,回复: 15282506 查看本文章
  1. 先设置eclipse【工作空间】workspace的JDK版本,即eclipse中所有项目的编译运行的环境(全局配置)

  1. 将JDK6的JRE添加到Installed JREs中;

  1. 配置当前工程的JDK版本;

  • 先选择工程并右键,选择Properties;

添加完后选择jre1.7然后生效:

  • 然后将与Java Build Path同页面的Java Compiler—右侧面板设置为1.7

  • 然后将与Java Compiler同页面的Project Facets—右侧面板勾上Java,Version设为1.7

完事;如此看来,可想而知为什么这么多的Java developer选择IDEA作为IED而非eclipse了,真的太难用了!!!

JDK7文件读写使用的API

JDK7中引入了新的文件操作类java.nio.file.Files,它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件;

JDK7读写文件代码示例

工程结构:

代码:

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Akira
 * @description 读写文件工具类
 * @date 2023/1/31
 */
public class MyInputAndOutputInJdk7Utils {

    public static void main(String[] args) {

        // (1) 读入
        // 相对路径 工程目录为根目录 文件位于根目录
        final List<String> stringList = readAllLinesInJdk7("input.txt");

        // 绝对路径
        // final List<String> stringList = readAllLinesInJdk7("C:\\IDE_Apps\\myCode\\ltcode\\input.txt");

        if (stringList != null) {
            for (String lineStr : stringList) {
                System.out.println(lineStr);
            }
        }

        System.out.println("-----");

        // (2) 输出
        final List<String> outputLineStrList = new ArrayList<>();
        if (stringList != null) {
            for (String lineStr : stringList) {
                final String outputLineStr = lineStr + " output ";
                outputLineStrList.add(outputLineStr);
                System.out.println(outputLineStr);
            }
        }
        writeAllLinesInJdk7(outputLineStrList, "output.txt");

    }

    /**
     * JDK7下的读取文本的方法
     *
     * @param filePath 输入文件路径 若输入文件在项目根目录则示例: filePath = "input.txt"
     * @return
     */
    private static List<String> readAllLinesInJdk7(String filePath) {
        try {
            return Files.readAllLines(Paths.get(filePath), Charset.forName("UTF-8"));
        } catch (IOException e) {
            System.out.println("readFile error! e:" + e);
            return null;
        }
    }

    /**
     * JDK7下的输出文本的方法 重复执行会替换文件内容而不是追加
     *
     * @param linesStr       每行数据字符串格式
     * @param targetFilePath 目标文件路径
     * @return
     */
    private static void writeAllLinesInJdk7(List<String> linesStr, String targetFilePath) {
        try {
            Files.write(Paths.get(targetFilePath), linesStr, Charset.forName("UTF-8"));
        } catch (IOException e) {
            System.out.println("writeFile error! e:" + e);
        }
    }

}

JDK6文件读写使用的API

JDK6下可选择的API有很多,包括RandomAccessFile、InputStream/OutputStream、FileInputStream/FileOutputStream、BufferedInputStream/BufferedOutputStream等,这里选择写法较为简洁的FileInputStream/FileOutputStream;

JDK6读写文件代码示例

工程结构:

代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Akira
 * @description 读写文件工具类
 * @date 2023/2/1
 */
public class MyInputAndOutputInJdk6Utils {

    public static void main(String[] args) {

        // (1) 读入
        // 相对路径 工程目录为根目录 文件位于根目录
        final String allLinesStr = readAllLinesInJdk6("input.txt");
        System.out.println(allLinesStr);

        // 绝对路径
        // final String allLinesStr = readAllLinesInJdk6("C:\\IDE_Apps\\myCode\\ltcode\\input.txt");

        System.out.println("-----");

        // (2) 输出
        final List<String> outputLineStrList = new ArrayList<String>();
        outputLineStrList.add("输出第1行");
        outputLineStrList.add("输出第2行");
        outputLineStrList.add("输出第3行");
        for (String outputLineStr : outputLineStrList) {
            System.out.println(outputLineStr);
        }

        writeAllLinesInJdk6(outputLineStrList, "output.txt");

    }

    /**
     * JDK7下的读取文本的方法
     *
     * @param filePath 输入文件路径 若输入文件在项目根目录则示例: filePath = "input.txt"
     * @return
     */
    private static String readAllLinesInJdk6(String filePath) {
        try {
            // 实际就这3行代码: 1.打开文件输入流绑定路径 2.一次性将文件读入字节数组 3.将字节数组转为字符串打印
            FileInputStream fis = new FileInputStream(filePath);
            // 将文件流一次性读入字节数组中 fis.available()为文件字节长度 这样可以避免中文乱码(因为UTF-8下中文占3字节/英文占1字符 因此不能把中文字节截断)
            byte[] allTxtBytes = new byte[fis.available()];
            fis.read(allTxtBytes);
            fis.close();
            // String提供字节数组转字符串的构造函数
            return new String(allTxtBytes);
        } catch (IOException e) {
            System.out.println("readFile error! e:" + e);
            return null;
        }
    }

    /**
     * JDK7下的输出文本的方法 重复执行会替换文件内容而不是追加
     *
     * @param linesStr       每行数据字符串格式
     * @param targetFilePath 目标文件路径
     * @return
     */
    private static void writeAllLinesInJdk6(List<String> linesStr, String targetFilePath) {
        try {
            // 拼接全部文本内容 也可以一行一行的写
            final StringBuilder allText = new StringBuilder();
            for (String lineStr : linesStr) {
                // 手动对list换行
                allText.append(lineStr).append("\n");
            }

            // 实际就这3行代码: 1.打开文件输出流绑定路径 2.写文本字符串的字节流 3.关闭输出流
            FileOutputStream fos = new FileOutputStream(targetFilePath);
            fos.write(allText.toString().getBytes());
            fos.close();
        } catch (IOException e) {
            System.out.println("writeFile error! e:" + e);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/minghao0508/article/details/128822880