掌握excel合并表格技巧提升工作效率的关键
536
2022-05-29
回城传送–》《JAVA筑基100例》
文章目录
零、前言
一、题目描述-合并多个文本文件
1、题目
2、解题思路
3、代码详解
二、题目描述-对大文件进行分割处理
1、题目
2、解题思路
3、代码详解
三、题目描述-分割后又再次合并
1、题目
2、解题思路
3、代码详解
4、多学一个知识点
四、推荐专栏
五、示例源码下载
零、前言
今天是学习 JAVA语言 打卡的第55天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。
因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
一、题目描述-合并多个文本文件
1、题目
题目:做一个合并多个文本文件的工具。
2、解题思路
创建一个类:TextFileConcatenation
使用TextFileConcatenation继承JFrame构建窗体
读取文本文件时,用的是BufferedReader类的readLine()方法读入一行数据。
将选择的多个文本文件合并到d://concatenation.txt
3、代码详解
package com.xiaoxuzhu; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; /** * Description: 合并多个文本文件工具 * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class TextFileConcatenation extends JFrame { /** * */ private JPanel contentPane; private JTextField textField; private File[] textFiles; private JTextArea textArea; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { TextFileConcatenation frame = new TextFileConcatenation(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public TextFileConcatenation() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); JPanel panel = new JPanel(); contentPane.add(panel, BorderLayout.NORTH); JLabel fileLabel = new JLabel("文件夹所在位置"); panel.add(fileLabel); textField = new JTextField(); panel.add(textField); textField.setColumns(10); JButton button = new JButton("选择文件夹"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_button_actionPerformed(e); } }); panel.add(button); JScrollPane scrollPane = new JScrollPane(); contentPane.add(scrollPane, BorderLayout.CENTER); textArea = new JTextArea(); scrollPane.setViewportView(textArea); JPanel buttonPanel = new JPanel(); contentPane.add(buttonPanel, BorderLayout.SOUTH); JButton concatButton = new JButton("合并文件"); concatButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { do_concatButton_actionPerformed(e); } }); buttonPanel.add(concatButton); } protected void do_button_actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setMultiSelectionEnabled(false); int result = chooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File selectFile = chooser.getSelectedFile(); textField.setText(selectFile.getAbsolutePath()); textFiles = selectFile.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if (pathname.getAbsolutePath().endsWith(".txt")) { return true; } else { return false; } } }); for (File textFile : textFiles) { textArea.append(textFile.getAbsolutePath() + "\n\r"); } } } protected void do_concatButton_actionPerformed(ActionEvent e) { if (textFiles == null) { JOptionPane.showMessageDialog(this, "请选择文件文件位置!", "警告信息", JOptionPane.WARNING_MESSAGE); return; } if (textFiles.length == 0) { JOptionPane.showMessageDialog(this, "文件夹中不包括文本文件!", "警告信息", JOptionPane.WARNING_MESSAGE); return; } BufferedReader reader = null; FileWriter writer = null; try { writer = new FileWriter("d://concatenation.txt");// 创建文件输出流 for (File textFile : textFiles) {// 遍历用户选择的文本文件 reader = new BufferedReader(new FileReader(textFile));// 创建缓冲输入流 String line; while ((line = reader.readLine()) != null) { writer.write(line);// 将读入的数据写入到文件中 } } JOptionPane.showMessageDialog(this, "文件合并成功!", "提示信息", JOptionPane.INFORMATION_MESSAGE); return; } catch (IOException e1) { e1.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
启动:
合并前:选择文件夹
合并后:
二、题目描述-对大文件进行分割处理
1、题目
题目:大数据文件为了方便传输,通常会进行切割处理。
实现一个将大文件分割成多个文件的工具
2、解题思路
创建一个类:ComminuteFrame
使用ComminuteFrame继承JFrame构建窗体
ComminuteFrame 增加标签,文本框和分割按钮
创建一个类:ComminuteUtil
ComminuteUtil主要处理分割的逻辑处理
通过输入流读取要分割的文件,分别从流中读取相应的字节数;
将其写到.tem的后缀文件中,分割的文件存放在源文件的对应目录下。
3、代码详解
ComminuteFrame类
package com.xiaoxuzhu; import java.awt.EventQueue; import java.awt.FileDialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; /** * Description: 对大文件进行分割处理 * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class ComminuteFrame extends JFrame { /** * */ private static final long serialVersionUID = 2547743180459668116L; private JPanel contentPane; private JTextField sourceTextField; private JTextField sizeTextField; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { ComminuteFrame frame = new ComminuteFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public ComminuteFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 430, 211); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); setTitle("文件分割"); JPanel panel = new JPanel(); panel.setBounds(0, 0, 414, 181); contentPane.add(panel); panel.setLayout(null); JLabel messagelabel = new JLabel("源文件:"); messagelabel.setBounds(47, 41, 54, 20); panel.add(messagelabel); sourceTextField = new JTextField(); sourceTextField.setBounds(105, 41, 178, 21); panel.add(sourceTextField); sourceTextField.setColumns(10); JButton sourceButton = new JButton("选择"); sourceButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { do_sourceButton_actionPerformed(arg0); } }); sourceButton.setBounds(303, 40, 67, 23); panel.add(sourceButton); JLabel sizelabel = new JLabel("分割大小:"); sizelabel.setBounds(34, 86, 67, 15); panel.add(sizelabel); sizeTextField = new JTextField(); sizeTextField.setBounds(105, 83, 178, 21); panel.add(sizeTextField); sizeTextField.setColumns(10); sizeTextField.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent event) { // 某键按下时调用的方法 char ch = event.getKeyChar(); // 获取用户键入的字符 if ((ch < '0' || ch > '9')) { // 如果用户输入的信息不为数字或小数 event.consume(); // 不允许用户键入 } } }); JLabel lblM = new JLabel("M"); lblM.setBounds(313, 86, 44, 15); panel.add(lblM); JButton cominButton = new JButton("分割"); cominButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { do_cominButton_actionPerformed(arg0); } }); cominButton.setBounds(101, 138, 93, 23); panel.add(cominButton); JButton close = new JButton("退出"); close.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { do_close_actionPerformed(arg0); } }); close.setBounds(229, 138, 93, 23); panel.add(close); } protected void do_sourceButton_actionPerformed(ActionEvent arg0) { java.awt.FileDialog fd = new FileDialog(this); fd.setVisible(true); String path = fd.getDirectory() + fd.getFile(); if (!path.equals("") && !(path == null)) { sourceTextField.setText(path); } } protected void do_cominButton_actionPerformed(ActionEvent arg0) { ComminuteUtil util = new ComminuteUtil(); String path = sourceTextField.getText(); int size = Integer.parseInt(sizeTextField.getText()); String subPath = path.substring(0, path.lastIndexOf("\\")); util.fenGe(new File(path), new File(subPath), size); JOptionPane.showMessageDialog(getContentPane(), "文件分割成功!", "信息提示框", JOptionPane.PLAIN_MESSAGE); } protected void do_close_actionPerformed(ActionEvent arg0) { System.exit(0); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
ComminuteUtil类
package com.xiaoxuzhu; import java.io.*; /** * Description: * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class ComminuteUtil { // 实现文件分割方法 public void fenGe(File commFile, File untieFile, int filesize) { FileInputStream fis = null; int size = 1024 * 1024; // 用来指定分割文件要以MB为单位 try { if (!untieFile.isDirectory()) { // 如果要保存分割文件地址不是路径 untieFile.mkdirs(); // 创建该路径 } size = size * filesize; int length = (int) commFile.length(); // 获取文件大小 int num = length / size; // 获取文件大小除以MB的得数 int yu = length % size; // 获取文件大小与MB相除的余数 String newfengeFile = commFile.getAbsolutePath(); // 获取保存文件的完成路径信息 int fileNew = newfengeFile.lastIndexOf("."); String strNew = newfengeFile.substring(fileNew, newfengeFile.length()); // 截取字符串 fis = new FileInputStream(commFile); // 创建FileInputStream类对象 File[] fl = new File[num + 1]; // 创建文件数组 int begin = 0; for (int i = 0; i < num; i++) { // 循环遍历数组 fl[i] = new File(untieFile.getAbsolutePath() + "\\" + (i + 1) + strNew + ".tem"); // 指定分割后小文件的文件名 if (!fl[i].isFile()) { fl[i].createNewFile(); // 创建该文件 } FileOutputStream fos = new FileOutputStream(fl[i]); byte[] bl = new byte[size]; fis.read(bl); // 读取分割后的小文件 fos.write(bl); // 写文件 begin = begin + size * 1024 * 1024; fos.close(); // 关闭流 } if (yu != 0) { // 文件大小与指定文件分割大小相除的余数不为0 fl[num] = new File(untieFile.getAbsolutePath() + "\\" + (num + 1) + strNew + ".tem"); // 指定文件分割后数组中最后一个文件名 if (!fl[num].isFile()) { fl[num].createNewFile(); // 新建文件 } FileOutputStream fyu = new FileOutputStream(fl[num]); byte[] byt = new byte[yu]; fis.read(byt); fyu.write(byt); fyu.close(); } } catch (Exception e) { e.printStackTrace(); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
分割前:
分割后:
三、题目描述-分割后又再次合并
1、题目
题目:分割后的文件要能再次正常使用,需要合并。
实现:做一个把分割后的文件又再次合并的工具
2、解题思路
创建一个类:UniteFrame
使用UniteFrame继承JFrame构建窗体
UniteFrame增加标签,文本框和分割按钮
创建一个类:UniteUtil
UniteUtil主要处理合并的逻辑处理
通过文件字节输入/输出流,把要合并的所有文件读取后,统一写入新文件中。
3、代码详解
UniteFrame类:
package com.xiaoxuzhu; import java.awt.EventQueue; import java.awt.FileDialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder; /** * Description: * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class UniteFrame extends JFrame { /** * */ private JPanel contentPane; JList fileList = new JList(); DefaultListModel listModel = new DefaultListModel(); String folder = ""; String fileName = ""; List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
UniteUtil类
package com.xiaoxuzhu; import java.io.*; import java.util.*; /** * Description: * * @author xiaoxuzhu * @version 1.0 * *
* 修改记录: * 修改后版本 修改人 修改日期 修改内容 * 2022/5/3.1 xiaoxuzhu 2022/5/3 Create ** @date 2022/5/3 */ public class UniteUtil { /** * @param file * :要进行合并的文件数组对象 * @param cunDir * :合并后文件的保存路径 * @param hz * :合并后文件的格式 */ public void unite(File[] file, File cunDir, String hz) { try { File heBingFile = new File(cunDir.getAbsoluteFile() + "\\UNTIE" + hz); // 指定分割后文件的文件名 if (!heBingFile.isFile()) { heBingFile.createNewFile(); } FileOutputStream fos = new FileOutputStream(heBingFile); // 创建FileOutputStream对象 for (int i = 0; i < file.length; i++) { // 循环遍历要进行合并的文件数组对象 FileInputStream fis = new FileInputStream(file[i]); int len = (int) file[i].length(); // 获取文件长度 byte[] bRead = new byte[len]; fis.read(bRead); // 读取文件 fos.write(bRead); // 写入文件 fis.close(); // 将流关闭 } fos.close(); } catch (Exception e) { e.printStackTrace(); } } // 获取磁盘所有文件方法 public List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
合并成功:
4、多学一个知识点
新合并的文件,是怎么知道后缀文件名是哪个
这个在进行分割处理时就有考虑设计了,切割的文件名是以1.zip.tem,前面的是切割排序号,中间的是源文件的文件类型后缀,最后是切割文件后缀。
String newName = fileName.substring(fileName.indexOf("."), fileName.lastIndexOf("."));
1
四、推荐专栏
《JAVA从零到壹》
《JAVA从零到壹》第八讲:系统常用类
《Hutool实战》7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)
五、示例源码下载
关注下面的公众号,回复筑基+题目号
筑基55
Java 数据结构
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。