一、txt文本切割代码
场景:公司项目txt日志文件太大,用notepad++看起来太卡了,公司禁用网盘也没法下载,自己空闲了写一个吧,复习一下输入出入流。
先给代码成品吧:
就是这么简单,几行代码就可以了。
package happything;import javax.swing.*;
import java.io.*;public class SlipTxt {// 源文件路径 D:\28515.txtpublic static String filePath = "D:\\28515.txt";// 目标文件目录 D:\happythings\fileSplitpublic static String fileOutHeadPath = "D:\\happythings\\fileSplit" ;// 目标文件名public static String fileOutName = "yx" ;// 目标文件的大小 kbpublic static int cellSize = 1024;public SlipTxt() {}/*** 文件字符流分割文件 -- 不会乱码* 文本操作最好用字符流* 影音视频之类操作最好用字节流* @throws IOException*//*** 文件字符流分割文件* @throws IOException*/private static void splitByFileReader(String resFile, String targetFileDir, String targetFileName, int targetFileSize) throws IOException {// 读取文件FileReader fileReader = new FileReader(resFile);FileWriter fileWriter = new FileWriter(targetFileDir + "/" + targetFileName + ".txt");// 一次读1024个字符char [] buf = new char[1024];int count = 0;int id = 1;while (fileReader.read(buf) != -1) {// 读取targetFileSize次之后,开始向第二个txt注入if (count != 0 && count % targetFileSize == 0) {// 创建新的输出流时,将前一个关闭。fileWriter.close();fileWriter = new FileWriter(targetFileDir + "/" + targetFileName + id + ".txt");id ++;}fileWriter.write(buf);count ++;}fileReader.close();fileWriter.close();}
}
后来想着复习一下java的gui控件,做一个简单的可视化吧
代码如下:
package happything;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class MyJframe extends JFrame {// 布局很简单,直接看swing菜鸟教程就可以,五分钟搞定public static void placeComponents(JPanel panel) {/* 布局部分我们这边不多做介绍* 这边设置布局为 null*/panel.setLayout(null);// 创建 JLabelJLabel resFileLabel = new JLabel("源文件目录:");resFileLabel.setBounds(10,20,130,25);panel.add(resFileLabel);JTextField resFileText = new JTextField(20);resFileText.setBounds(160,20,200,25);panel.add(resFileText);// 目标文件目录JLabel targetFileDir = new JLabel("目标文件目录:");targetFileDir.setBounds(10,50,130,25);panel.add(targetFileDir);JTextField targetFileDirText = new JTextField(20);targetFileDirText.setBounds(160,50,200,25);panel.add(targetFileDirText);// 目标文件名JLabel targetFileName = new JLabel("目标文件名:");targetFileName.setBounds(10,80,130,25);panel.add(targetFileName);JTextField targetFileNameText = new JTextField(20);targetFileNameText.setBounds(160,80,200,25);panel.add(targetFileNameText);// 目标文件大小JLabel targetFileSizeLabel = new JLabel("目标文件大小(kb):");targetFileSizeLabel.setBounds(10,110,130,25);panel.add(targetFileSizeLabel);JTextField targetFileSizeText = new JTextField(20);targetFileSizeText.setBounds(160,110,200,25);panel.add(targetFileSizeText);// 开始分割JButton splitButton = new JButton("开始分割");splitButton.setBounds(10, 170, 100, 25);panel.add(splitButton);splitButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String resFile = resFileText.getText();String targetFileDir = targetFileDirText.getText();String targetFileName = targetFileNameText.getText();String targetFileSize = targetFileSizeText.getText();try {splitByFileReader(resFile, targetFileDir, targetFileName, Integer.valueOf(targetFileSize));} catch (IOException ex) {ex.printStackTrace();}}});}public static void main(String[] args) {// 创建 JFrame 实例JFrame frame = new JFrame("文件分割器");frame.setBounds(400, 180, 400, 240);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel panel = new JPanel();// 添加面板frame.add(panel);MyJframe.placeComponents(panel);// 设置界面可见frame.setVisible(true);}/*** 文件字符流分割文件* @throws IOException*/private static void splitByFileReader(String resFile, String targetFileDir, String targetFileName, int targetFileSize) throws IOException {// 读取文件FileReader fileReader = new FileReader(resFile);FileWriter fileWriter = new FileWriter(targetFileDir + "/" + targetFileName + ".txt");// 一次读1024个字符char [] buf = new char[1024];int count = 0;int id = 1;while (fileReader.read(buf) != -1) {// 读取targetFileSize次之后,开始向第二个txt注入if (count != 0 && count % targetFileSize == 0) {fileWriter.close();fileWriter = new FileWriter(targetFileDir + "/" + targetFileName + id + ".txt");id ++;}fileWriter.write(buf);count ++;}fileReader.close();fileWriter.close();}}
成品如图:
notes:
汉字文本文件最好用字符流。一个字符在utf8下占3字节,在控制目标文本大小的时候,很容易出现一个汉字的三个字节在两个分割后的txt文件中,造成乱码。
在计算机最初的诞生阶段,采用的编码格式是ASCII编码,这种编码格式只制定了英文字母,数字以及一些标点符号的编码,但随着计算机的发展,不同的语言体系,用ASCII编码已经不再能全部包含各种文字体系的文字。针对中文,最初提出了GB2312的编码格式,这种编码格式中,一个中文占用两个字节长度。但各个语言体系使用不同的编码格式,这样就使计算机在各个语言体系间切换变得异常麻烦。由此,国际组织提出了UNICODE 编码格式,这种编码格式包含了大多数语言体系的文字,也被称为万国码,在这个编码格式中,一个中文占用四个字节长度。但这个编码格式的中文,并不需要使用四个字节就能完成编码,相当于有一个字节被浪费了,由此,进一步提出了utf-8的中文编码格式,该编码格式中,一个中文占用三个字节长。
二、java程序转exe可执行文件
想着这个还是挺常用的,要是每次都要重新打开idea也太费劲了,就转成了exe文件。
大概过程:
1、打成jar包
2、下载exe4j工具,按需要操作,把jar包转成exe文件
截图教程太麻烦了,有空了补上
jar转exe 详细过程
https://www.jianshu.com/p/97601c111867
三、升级成不需要jre环境依赖也可以执行的exe文件。
大概过程:
1、下载inno setup工具
2、将exe文件和jre依赖都注入进去,就ok了。
截图教程太麻烦了,有空了补上