一般的String写入文件都是一行一行写入的,也就是横向顺序写入的,简单的练习下纵向按块写入,如下所示:
思路:
使用2维数据Array[][],然后赋值,很简单。
下面是代码,代码是写着玩的,不是很严谨,没什么实用价值。
import java.io.FileOutputStream; import java.io.OutputStreamWriter; public class 文件按列写 { // 按指定编码的字节数截取字符串 public String subStrMethod(String srcStr, int count, String charSet) throws Exception { if (srcStr == null || srcStr.length() == 0) { return null; } if (charSet == null) { charSet = "utf-8"; } if (srcStr.getBytes(charSet).length <= count) { return srcStr; } int num = 0;// 已经截取字符的长度 int length = 0;// 每个字符的长度 StringBuffer sb = new StringBuffer(); char ch[] = srcStr.toCharArray(); for (int i = 0; i < ch.length; i++) { length = String.valueOf(ch[i]).getBytes(charSet).length; num += length; if (num > count) { break; } sb.append(ch[i]); } return sb.toString(); } public String generateTestData(int num) { StringBuffer sb = new StringBuffer(); for (int i = 1; i <= num; i++) { sb.append("第").append(i).append("行测试数据"); } return sb.toString(); } public void writeContentToFile(String str, String filePath, String charsetName) throws Exception { if (charsetName == null) { charsetName = "utf-8"; } OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream( filePath), charsetName); out.write(str); out.close(); } /** * 优先写第一块 * * @param srcStr * 原字符串 * @param charsetName * 目的字符串编码 * @param perLineTotalLen * 一行总的长度 * @param splitNum * 一行切割块的数量 * @param spaceNum * 切割块直接空格的数量 * @param colSplitLen * 满多少列输出分割标识 * @param splitStr * 分割标识 * @throws Exception */ public String getStrBySplitNum(String srcStr, String charsetName, int perLineTotalLen, int splitNum, int spaceNum, int colSplitLen, String splitStr) throws Exception { String lineSplit = System.getProperty("line.separator"); if (splitNum <= 0) { splitNum = 1; } if (charsetName == null) { charsetName = "utf-8"; } if (srcStr == null || srcStr.length() == 0) { return null; } // 块分割字符串,默认为空行 if (splitStr == null) { splitStr = System.getProperty("line.separator"); } // 每行的字节数大小,默认72 if (perLineTotalLen <= 0) { perLineTotalLen = 72; } // 块之间的空格,默认4个空格 if (spaceNum < 0) { spaceNum = 4; } // 每块的列数 if (colSplitLen < 0) { colSplitLen = perLineTotalLen; } String blockSplitStr = new String(); for (int i = 0; i < spaceNum; i++) { blockSplitStr = blockSplitStr + " "; } blockSplitStr = new String(blockSplitStr); boolean isLastBlock = false; // 优先考虑第一块 String firstBlockStr = new String(); int perBlockLen = 0;// 每块平均长度 int firstBlobkLen = 0;// 第一块的长度 int lastBlockLen = 0; String tmpStr = new String(); int tmpSplitNum = splitNum; int tmpColSplitLen = colSplitLen; StringBuffer resultStr = new StringBuffer(5120); // 行 列 String[][] resultArray = new String[tmpColSplitLen][tmpSplitNum]; String tmpValue = null; while (srcStr != null && srcStr.length() > 0) { firstBlockStr = new String(); isLastBlock = false; perBlockLen = (perLineTotalLen - lastBlockLen - (splitNum - 1) * spaceNum) / splitNum;// 每块平均长度 firstBlobkLen = perBlockLen + (perLineTotalLen - lastBlockLen - (splitNum - 1) * spaceNum) % splitNum;// 第一块的长度 lastBlockLen = lastBlockLen + firstBlobkLen; if (srcStr.getBytes(charsetName).length < firstBlobkLen * colSplitLen) { firstBlockStr = new String(srcStr); colSplitLen = (srcStr.getBytes(charsetName).length + firstBlobkLen - 1) / firstBlobkLen; isLastBlock = true; srcStr = new String(); } else { firstBlockStr = subStrMethod(srcStr, firstBlobkLen * colSplitLen, charsetName); srcStr = new String(srcStr.substring(firstBlockStr.length())); } tmpStr = null; for (int i = 0; i < colSplitLen; i++) { tmpStr = subStrMethod(firstBlockStr, firstBlobkLen, charsetName); if (isLastBlock || splitNum == 1) { resultArray[i][tmpSplitNum - splitNum] = new String(tmpStr + lineSplit); } else { resultArray[i][tmpSplitNum - splitNum] = new String(tmpStr + blockSplitStr); } firstBlockStr = new String(firstBlockStr.substring(tmpStr .length())); } // 可能遇到双字节字符导致实际长度比计算的长度短,需要查看数组是否还能存放数据 srcStr = new String(firstBlockStr + srcStr); tmpStr = null; if (srcStr.getBytes(charsetName).length <= (tmpColSplitLen - colSplitLen) * firstBlobkLen) { for (int k = colSplitLen; k < tmpColSplitLen; k++) { tmpStr = subStrMethod(srcStr, firstBlobkLen, charsetName); if (tmpStr == null) { break; } if (isLastBlock || splitNum == 1) { resultArray[k][tmpSplitNum - splitNum] = new String( tmpStr + lineSplit); } else { resultArray[k][tmpSplitNum - splitNum] = new String( tmpStr + blockSplitStr); } if (srcStr == null || srcStr.length() == 0) { srcStr = new String(); break; } srcStr = new String(srcStr.substring(tmpStr.length())); } } splitNum = splitNum - 1; if (splitNum == 0 && srcStr.length() > 0) { splitNum = tmpSplitNum; tmpValue = null; lastBlockLen = 0; for (int i = 0; i < resultArray.length; i++) { for (int j = 0; j < resultArray[i].length; j++) { tmpValue = resultArray[i][j]; if (tmpValue != null && tmpValue.length() > 0) { resultStr.append(resultArray[i][j]); } } } resultStr.append(splitStr).append(lineSplit); resultArray = new String[tmpColSplitLen][tmpSplitNum]; } } tmpValue = null; // 修正数组的值 for (int i = 0; i < resultArray.length; i++) { for (int j = 0; j < resultArray[i].length; j++) { tmpValue = resultArray[i][j]; if (tmpValue != null && tmpValue.length() > 0 && (i + 1 < tmpColSplitLen) && (j >= 1) && (resultArray[i + 1][j] == null)) { for (int k = i + 1; k < resultArray.length; k++) { resultArray[k][j - 1] = new String( resultArray[k][j - 1] + lineSplit); } break; } } } tmpValue = null; // 得到数组的值 for (int i = 0; i < resultArray.length; i++) { for (int j = 0; j < resultArray[i].length; j++) { tmpValue = resultArray[i][j]; if (tmpValue != null && tmpValue.length() > 0) { resultStr.append(resultArray[i][j]); } } } resultStr.append(splitStr); return resultStr.toString(); } public static void main(String[] args) throws Exception { 文件按列写 t = new 文件按列写(); String testStr = t.generateTestData(63); String splitStr = "-------------------------------我是分隔符------------------------------"; //90 每行90字节 //4 分割4列 //5 列之间5个空格 //14 每列14个字节 String content = t.getStrBySplitNum(testStr, "utf-8", 90, 4, 5, 14, splitStr); t.writeContentToFile(content, "f:/saveFile/temp/result.txt", "utf-8"); } }
本文系原创,转载请注明出处,谢谢。
相关推荐
接下来,我们根据提供的文件内容详细解析Java练习题中所涉及的关键知识点。 1. Java语言的优点和特点之一是多线程,这允许Java程序能够并行执行多个任务。Java的多线程机制是Java语言的强大功能之一,它支持并发...
同样,它按照字符顺序写入,直到文件结束或流关闭。 3. **缓冲流(Buffered Streams)**: - `BufferedReader` 和 `BufferedWriter` 提供了缓冲功能,提高了读写效率。`BufferedReader` 从底层的 `Reader`(如 `...
在这个项目中,"Java swing实现简单的C/S聊天及文件传输系统"是利用Swing构建一个客户端/服务器(Client/Server)架构的聊天和文件传输应用。这个系统允许用户通过网络进行文本聊天并交换文件。以下是关于这个项目的...
在Java编程语言中,随机访问文件(RandomAccessFile)是一个非常重要的类,它允许程序员以随机方式读写文件。...在JavaBase的压缩包文件中,可能包含了更多关于这个主题的练习和示例代码,供学习者进一步探索和实践。
在Java编程中,实现一个基于文件的通讯录系统是一个实用且基础的练习,它可以帮助开发者掌握文件操作、数据存储和简单用户界面设计等技能。在这个项目中,我们不依赖数据库,而是选择直接将数据存储在文件中,这使得...
### Java强化练习知识点详解 #### 一、编程题解析 **1. 单词排序** - **需求描述**: 从控制台输入多个单词(输入回车结束),将这些单词存储在一个集合中,并按照字典顺序排序后打印出来,排序时忽略字母的大小写...
计算机等级考试二级Java练习题及解析主要涵盖编程基础、数据结构、算法以及软件工程等多个方面的知识。以下是根据题目内容解析的详细知识点: 1. 栈的特性:栈是一种线性表,具有后进先出(LIFO)的特性,允许在...
### Java编程经典练习题知识点详解 #### 1. 斐波那契数列 - **题目描述**:生成斐波那契数列的前几项。 - **解题思路**: - 使用循环结构(如 for 循环)来生成斐波那契数列。 - 设置两个变量存储当前项和前一项...
这些记录按照固定的格式和顺序写入文件,读取时也按顺序逐条处理。这种类型的文件不支持随机访问,但对大容量数据的连续读写非常高效。 在这个项目中,"Creta库存产品类"(可能名为`ProductStock`)是一个核心组件...
10.2.2 通过FilterOutputStream向OutputStream里写入数据 10.3 本身的缺陷: 10.4 File类 10.4.1 目录列表器 10.4.2 检查与创建目录 10.5 IO流的典型应用 10.5.1 输入流 10.5.2 输出流 10.5.3 快捷文件处理 10.5.4 ...
这个类提供了一种高效的方式,让我们能够在文件的任何位置读取或写入数据,而不仅仅是从文件的开头顺序读取。下面将详细探讨`RandomAccessFile`的相关知识点及其在文件管理与操作中的应用。 1. **`RandomAccessFile...
在本文件中,我们看到了一系列的练习题,这些题目旨在加深对Java语言的理解和应用,主要涵盖了Java的开发工具、基础语法、基本数据类型、字符串操作、类和对象、继承、数组、控制语句、修饰符、Java SE标准API、文件...
5. **I/O操作**:如果程序需要读取或写入文件,如存储用户成绩或题目库,那么Java的FileInputStream、FileOutputStream以及更高级的ObjectInputStream和ObjectOutputStream将被用到。这使得数据可以在程序运行期间...
4. **Java 流的概念**:在Java中,流(Stream)是用来处理数据序列的,可以用来读取或写入数据。流是一个流动的数据缓冲区,数据从源到目的地串行传输。Java的`java.io`包提供了各种流的接口和类,如`OutputStream`...
为了安全起见,Java Applet受到严格的沙箱限制,不允许直接读取或写入本地文件系统,也不允许加载本地程序库。然而,它们可以访问部分系统属性,如操作系统名称等。 #### 八、Swing容器组件 **题目**:下列哪个...
3. 实践文件I/O操作,如读取和写入图像文件。 4. 学习基本的算法和数据结构,如排序和搜索。 5. 锻炼问题解决和调试技能。 五、项目实施 为了运行这个游戏,你需要将"JAVA puzzle game.docx"中的代码复制到Java...
2. **文件读取与链表操作**:使用Java的`BufferedReader`和`FileReader`来读取文本文件,逐行读取并创建`String`对象,然后将这些对象添加到`LinkedList`中。反转链表的顺序可以使用`Collections.reverse()`方法,...
Java软件开发大赛练习题涉及到多个Java基础知识,包括常量定义、数据类型、类继承、异常处理、包、类的构成、文件操作以及输入/输出流等。下面逐一解析这些知识点: 1. **常量定义**:在Java中,定义常量的保留字是...
根据给定的文件信息,我们可以总结出一系列关于Java编程的基础知识点,这些知识点涵盖了Java语言的基本概念、语法结构、异常处理、文件操作、图形用户界面(GUI)设计、多线程编程以及网络编程等重要领域。 ### Java...
在Java编程语言中,开发一个简单的Windows记事本应用程序是一个常见的练习,可以帮助初学者理解GUI(图形用户界面)编程和文件操作。以下是一些关键知识点,根据提供的代码片段: 1. **Swing库**:Java Swing是Java...