`
53873039oycg
  • 浏览: 844087 次
  • 性别: 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
分享到:
评论

相关推荐

    白色大气风格的旅游酒店企业网站模板.zip

    白色大气风格的旅游酒店企业网站模板.zip

    python实现用户注册

    python实现用户注册

    【图像压缩】基于matlab GUI Haar小波变换图像压缩(含PSNR)【含Matlab源码 9979期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    (177354822)java小鸟游戏.zip

    内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    VB+access学生管理系统(论文+系统)(2024am).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    数学计算中的平方表与圆周率π的应用

    内容概要:文档名为《平方表,派表集合.docx》,主要内容是1至1000的平方值以及1至1000与π的乘积结果。每个数字从1开始,逐步增加至1000,对应地计算了平方值和乘以π后的值。所有计算均通过Python脚本完成,并在文档中列出了详细的计算结果。 适合人群:需要进行数学计算或程序验证的学生、教师和研究人员。 使用场景及目标:用于快速查找特定数字的平方值或其与π的乘积,适用于教学、科研及程序测试等场景。 阅读建议:可以直接查阅所需的具体数值,无需从头到尾逐行阅读。建议在使用时配合相应的计算工具,以验证和拓展数据的应用范围。

    VB+SQL光盘信息管理系统(源代码+系统+答辩PPT)(20244m).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

    白色大气风格的健身私人教练模板下载.zip

    白色大气风格的健身私人教练模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色简洁风的商务网站模板下载.zip

    白色大气风格的前端设计案例展示模板.zip

    白色大气风格的前端设计案例展示模板.zip

    圣诞树项目中的硬件和MATLAB实现指南

    内容概要:本文介绍了两个有趣的圣诞树项目方向:一是使用Arduino或Raspberry Pi开发可编程的圣诞树灯光控制系统;二是基于MATLAB开发一个圣诞树模拟器。前者通过硬件连接、编写Arduino/Raspberry Pi程序、MATLAB控制程序来实现LED灯带的闪烁;后者则通过创建圣诞树图形、添加动画效果、用户交互功能来实现虚拟的圣诞树效果。 适合人群:具备基本电子工程和编程基础的爱好者和学生。 使用场景及目标:①通过硬件和MATLAB的结合,实现实际的圣诞树灯光控制系统;②通过MATLAB模拟器,实现一个有趣的圣诞树动画展示。 阅读建议:读者可以根据自己的兴趣选择合适的项目方向,并按照步骤进行动手实践,加深对硬件编程和MATLAB编程的理解。

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    白色扁平风格的温室大棚公司企业网站源码下载.zip

    Navicat.zip

    Navicat.zip

    Scikit-learn库中主成分分析(PCA)技术的Python实现教程

    内容概要:本文详细介绍了主成分分析(PCA)技术的原理及其在Scikit-learn库中的Python实现。首先讲解了PCA的基本概念和作用,接着通过具体示例展示了如何使用Scikit-learn进行PCA降维。内容涵盖了数据准备、模型训练、数据降维、逆转换数据等步骤,并通过可视化和实际应用案例展示了PCA的效果。最后讨论了PCA的局限性和参数调整方法。 适合人群:数据科学家、机器学习工程师、数据分析从业者及科研人员。 使用场景及目标:适用于高维数据处理,特别是在需要降维以简化数据结构、提高模型性能的场景中。具体目标包括减少计算复杂度、提高数据可视化效果和改进模型训练速度。 其他说明:本文不仅提供了详细的代码示例,还讨论了PCA在手写数字识别和机器学习模型中的应用。通过比较原始数据和降维后数据的模型性能,读者可以更好地理解PCA的影响。

    (175846434)目标检测-将VOC格式的数据集一键转化为COCO和YOLO格式

    VOC格式的数据集转COCO格式数据集 VOC格式的数据集转YOLO格式数据集。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    数字信号处理课程设计.doc

    数字信号处理课程设计.doc

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    白色扁平化风格的灯饰灯具销售企业网站模板.zip

    华豫佰佳组合促销视图.sql

    华豫佰佳组合促销视图.sql

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的商务团队公司模板下载.zip

    白色大气风格的VPS销售网站模板.zip

    白色大气风格的VPS销售网站模板.zip

Global site tag (gtag.js) - Google Analytics