`
53873039oycg
  • 浏览: 841339 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java简单练习之按倒N顺序写入文件

    博客分类:
  • java
 
阅读更多

      一般的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");
	}
}

  

    本文系原创,转载请注明出处,谢谢。

   

 

  • 大小: 188 KB
0
0
分享到:
评论

相关推荐

    java练习题大全

    接下来,我们根据提供的文件内容详细解析Java练习题中所涉及的关键知识点。 1. Java语言的优点和特点之一是多线程,这允许Java程序能够并行执行多个任务。Java的多线程机制是Java语言的强大功能之一,它支持并发...

    JAVA实验报告 举重成绩单

    同样,它按照字符顺序写入,直到文件结束或流关闭。 3. **缓冲流(Buffered Streams)**: - `BufferedReader` 和 `BufferedWriter` 提供了缓冲功能,提高了读写效率。`BufferedReader` 从底层的 `Reader`(如 `...

    Java swing实现简单的C/S聊天及文件传输系统

    在这个项目中,"Java swing实现简单的C/S聊天及文件传输系统"是利用Swing构建一个客户端/服务器(Client/Server)架构的聊天和文件传输应用。这个系统允许用户通过网络进行文本聊天并交换文件。以下是关于这个项目的...

    学习张孝祥的向文件中写入数据和读取数据

    在Java编程语言中,随机访问文件(RandomAccessFile)是一个非常重要的类,它允许程序员以随机方式读写文件。...在JavaBase的压缩包文件中,可能包含了更多关于这个主题的练习和示例代码,供学习者进一步探索和实践。

    java写的的通讯录(用文件实现的)

    在Java编程中,实现一个基于文件的通讯录系统是一个实用且基础的练习,它可以帮助开发者掌握文件操作、数据存储和简单用户界面设计等技能。在这个项目中,我们不依赖数据库,而是选择直接将数据存储在文件中,这使得...

    java强化练习

    ### Java强化练习知识点详解 #### 一、编程题解析 **1. 单词排序** - **需求描述**: 从控制台输入多个单词(输入回车结束),将这些单词存储在一个集合中,并按照字典顺序排序后打印出来,排序时忽略字母的大小写...

    计算机等级考试二级Java练习题及解析7.doc

    计算机等级考试二级Java练习题及解析主要涵盖编程基础、数据结构、算法以及软件工程等多个方面的知识。以下是根据题目内容解析的详细知识点: 1. 栈的特性:栈是一种线性表,具有后进先出(LIFO)的特性,允许在...

    Java编程经典练习题[附带解题思路

    ### Java编程经典练习题知识点详解 #### 1. 斐波那契数列 - **题目描述**:生成斐波那契数列的前几项。 - **解题思路**: - 使用循环结构(如 for 循环)来生成斐波那契数列。 - 设置两个变量存储当前项和前一项...

    Java顺序文件:具有顺序文件并显示产品库存查询的Creta库存产品类

    这些记录按照固定的格式和顺序写入文件,读取时也按顺序逐条处理。这种类型的文件不支持随机访问,但对大容量数据的连续读写非常高效。 在这个项目中,"Creta库存产品类"(可能名为`ProductStock`)是一个核心组件...

    Thinking in Java 中文第四版+习题答案

    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 ...

    dnzyz.rar_RandomAccessFile_java 文件管理_文件操作

    这个类提供了一种高效的方式,让我们能够在文件的任何位置读取或写入数据,而不仅仅是从文件的开头顺序读取。下面将详细探讨`RandomAccessFile`的相关知识点及其在文件管理与操作中的应用。 1. **`RandomAccessFile...

    Java程序设计练习题(3G软件开发).pdf

    在本文件中,我们看到了一系列的练习题,这些题目旨在加深对Java语言的理解和应用,主要涵盖了Java的开发工具、基础语法、基本数据类型、字符串操作、类和对象、继承、数组、控制语句、修饰符、Java SE标准API、文件...

    用Java写的英语测试小程序

    5. **I/O操作**:如果程序需要读取或写入文件,如存储用户成绩或题目库,那么Java的FileInputStream、FileOutputStream以及更高级的ObjectInputStream和ObjectOutputStream将被用到。这使得数据可以在程序运行期间...

    2015全国计算机二级JAVA考试练习题及答案.docx

    4. **Java 流的概念**:在Java中,流(Stream)是用来处理数据序列的,可以用来读取或写入数据。流是一个流动的数据缓冲区,数据从源到目的地串行传输。Java的`java.io`包提供了各种流的接口和类,如`OutputStream`...

    2011最新整理Java练习题

    为了安全起见,Java Applet受到严格的沙箱限制,不允许直接读取或写入本地文件系统,也不允许加载本地程序库。然而,它们可以访问部分系统属性,如操作系统名称等。 #### 八、Swing容器组件 **题目**:下列哪个...

    JAVA-puzzle-game.zip_JAVA 拼图 作业_java 拼图

    3. 实践文件I/O操作,如读取和写入图像文件。 4. 学习基本的算法和数据结构,如排序和搜索。 5. 锻炼问题解决和调试技能。 五、项目实施 为了运行这个游戏,你需要将"JAVA puzzle game.docx"中的代码复制到Java...

    java练习[借鉴].pdf

    2. **文件读取与链表操作**:使用Java的`BufferedReader`和`FileReader`来读取文本文件,逐行读取并创建`String`对象,然后将这些对象添加到`LinkedList`中。反转链表的顺序可以使用`Collections.reverse()`方法,...

    Java软件开发大赛练习题(第1套).doc

    Java软件开发大赛练习题涉及到多个Java基础知识,包括常量定义、数据类型、类继承、异常处理、包、类的构成、文件操作以及输入/输出流等。下面逐一解析这些知识点: 1. **常量定义**:在Java中,定义常量的保留字是...

    java练习题

    根据给定的文件信息,我们可以总结出一系列关于Java编程的基础知识点,这些知识点涵盖了Java语言的基本概念、语法结构、异常处理、文件操作、图形用户界面(GUI)设计、多线程编程以及网络编程等重要领域。 ### Java...

    java简单记事本[归类].pdf

    在Java编程语言中,开发一个简单的Windows记事本应用程序是一个常见的练习,可以帮助初学者理解GUI(图形用户界面)编程和文件操作。以下是一些关键知识点,根据提供的代码片段: 1. **Swing库**:Java Swing是Java...

Global site tag (gtag.js) - Google Analytics