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

news2024/10/9 20:23:08

最近有使用低版本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下的配置方法;

  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);
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins部署过程

Jenkins 安装 示例服务器为 阿里云 CentOS 服务器。安全组中增加 8080 端口 Jenkins 默认占用 Jenkins 安装大体分两种方式&#xff0c;一种使用 Docker 另一种则是直接安装&#xff0c;示例选择后者。不管使用哪种方式安装&#xff0c;最终使用层面都是一样的。 Linux安装过…

Linux下源码安装nginx

一 安装步骤 nginx在linux下的源码安装&#xff0c;步骤还是比较简单的&#xff0c;主要分为以下 1. 下载安装包&#xff0c;这里选择&#xff1a;nginx-1.18.0.tar.gz 下载地址&#xff1a;http://nginx.org/en/download.html 2. 安装前置环境&#xff1a; yum install -y…

苹果手机字体大小怎么设置?简单实用,轻松学会

使用苹果手机的时候&#xff0c;发现苹果手机的字体看起来不是很舒服&#xff0c;想要将字体调大一点&#xff0c;却不知道怎么办。苹果手机字体大小怎么设置&#xff1f;其实方法很简单&#xff0c;今天小编就来具体的讲一下调整苹果手机字体大小的方法。 苹果手机字体大小怎么…

智能工厂中的设备如何实现远程监控和故障报警

智能工厂是在数字化工厂内&#xff0c;利用物联网技术和云计算计算加强设备信息管理水平&#xff0c;提高生产过程可控性、减少生产线人工干预&#xff0c;保证安全稳定的生产节奏&#xff0c;助力构建高效、节能、绿色、舒适、安全的工厂。 物通博联推出的智能工厂设备物联网…

C语言及算法设计课程实验四:选择结构程序设计

C语言及算法设计课程实验四&#xff1a;选择结构程序设计一、实验目的二、实验内容2.1、根据x的分段函数求对于的y值2.2、求小于1000正数的平方根2.3、百分制等级输出2.4、四个整数的顺序输出三、实验步骤3.1、选择结构程序设计实验题目1&#xff1a;根据x的分段函数求对于的y值…

四、GStreamer基础

本章介绍GStreamer的基本概念。理解这些概念对于阅读本指南的其他任何内容都是很重要的&#xff0c;它们都假定理解了这些基本概念。 元素 元素是GStreamer中最重要的一类对象。你通常会创建一个链接在一起的元素链&#xff0c;并让数据在这个元素链中流动。元素有一个特定的…

运动耳机有必要买吗、口碑最好的运动耳机品牌排行

冬天绝对是个减肥的好季节&#xff0c;因为这个季节天气比较冷&#xff0c;我们在运动过程中消耗的热量也就会更多&#xff0c;因此选择一款不错的运动耳机来用坚持就显得尤为重要了。这款运动耳机要能稳定在耳朵上&#xff0c;还要具备防水功能&#xff0c;同时音质上也要有保…

gd32f103vbt6 串口OTA升级-问题记录

今天研究了一下gd32单片机串口OTA升级的事情。我感觉ota的唯一好处就是不用调试器就可以下载&#xff08;更新&#xff09;单片机应用程序。(但是需要232串口&#xff0c;OTA程序我是使用stlink下载的&#xff01;&#xff01;) 可能有些同学要问&#xff0c;32的单片机本身就…

【综合】数字IC设计需要考虑的时序参数;Race Hazard;同步系统时序要求;建立时间、保持时间;偏斜;抖动;毛刺、竞争冒险;亚稳态

【综合】数字IC设计需要考虑的时序参数&#xff1b;Race Hazard&#xff1b;同步系统时序要求&#xff1b;建立时间、保持时间&#xff1b;偏斜&#xff1b;抖动&#xff1b;毛刺、竞争冒险&#xff1b;亚稳态数字设计时需要考虑的时序参数传播延迟 propagation delay, 上升时间…

十一、树结构的实际应用—堆排序

1、基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最好最坏平均时间复杂度均为O(n\log n) 。也不是稳定排序。堆是具有以下性质的完全二叉树&#xff1a;每个节点的值都大于或等于其左右孩子节点的值&#xff0c;…

云音乐实现注册功能

1. 新建web项目 Shop_SM2. 复制Shop资源和相关代码&#xff0c;实现注册功能回顾当前配置下的加载顺序1.MyBatis的主配置文件mybatis-config.xml &#xff08;在根目录下&#xff09;和 工具类MyBatisUtil&#xff08;注意总配置文件的路径&#xff09;2.实体类&#xff08;Use…

docker篇---pycharm连接docker,使用docker环境

pycharm连接docker&#xff0c;使用docker环境一、生成镜像和容器1.1 创建容器&#xff0c;需要加端口映射1.2 进入容器1.3 设置root密码&#xff0c;后续登录会用到1.4 修改配置文件1.5 重启ssh服务1.5 本机连接ssh二、pycharm连接docker2.1 允许远程客户端连接2.2 pycharm配置…

线程互斥与同步--Linux

文章目录线程互斥的概念与意义互斥的原理--原子性关于售票模拟的互斥应用死锁问题线程同步的概念与意义条件变量实现同步生产者消费者模型--互斥与同步基于阻塞队列的生产者消费者模型基于环形队列的生产者消费者模型POSIX信号量线程池线程安全下的单例模式总结线程互斥的概念与…

OMS标准 第二卷 主要通讯

版本4.1.2/2016-12-16 发布 1 引言 1.1 概述 本部分描述了从设备&#xff08;仪表或执行器或断路器&#xff09;和&#xff08;固定的&#xff0c;通常由市电供电的&#xff09;主设备&#xff08;网关或其他通信单元&#xff09;之间有线和无线通信的最低开放式计量系统要…

1. Mybatis 入门

文章目录1. Mybatis 简介2. Mybatis 快速入门3. 使用 idea 写 SQL4. Mapper 代理开发5. MyBatis 核心配置文件1. Mybatis 简介 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。 官方文档&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 持久层&am…

【自学Docker】Docker cp命令

Docker cp命令 大纲 docker cp命令教程 docker cp 命令用于在本地文件系统与 Dokcer容器 之间复制文件或者文件夹。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker cp命令语法 从容器复制到宿主机 haicoder(www.haicoder.net)# docker cp [OPTION…

第57篇-某日头条signature参数分析【2023-02-01】

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、signature参数四、完整代码一、前言 今天来看一下新闻网站,分析一下参数 二、网站分析 网…

WebDAV之葫芦儿·派盘+一叶日记

一叶日记 支持WebDAV方式连接葫芦儿派盘。 推荐一款操作方便、界面简洁,记录生活点滴与心情,具有诗情画意的日记软件。 一叶日记是一款记录日记的手机软件,在这款软件中它里面有着各种不同的工具,可以方便用户去随时随地的记录日记,同时里面还有着各种不同的主题背景&…

补充:论Unity_InputSystemPacakage如何使用

图1补充一下默认特殊值如何设定&#xff0c;点击ProjectingSettings——InputSystemPacakage——Create Settings Asset 即可设置默认特殊值&#xff0c;或者点击图1中的Open input settings也可以打开此界面。 创建后会在Project窗口出现一个配置文件&#xff0c;不需要时删除…

你说反射有点难追,我觉得应该知难而退。

文章目录问题源码解析溯源问题解决方案第一种&#xff1a;第二种&#xff1a;第三种&#xff1a;问题 今天小伙伴遇到一个问题&#xff0c;有关于反射的&#xff0c;写个demo&#xff0c;大家看一下。 如上&#xff0c;运行之后会报错&#xff1a;出现了非法参数。 Exception…