【文章标题】java小程序(1)
【文章作者】曾健生
【作者邮箱】[email protected]
【作者QQ】190678908
【作者声明】本人水平有限,失误之处,敬请各位指出。本人以前写的一些小程序,分享一下希望对各位学习java有帮助 ^-^
*******************************************************************************
题目:
/*====第二题====================================
自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
能够在读取的每行前面都加上有行号和冒号。
提示:(MyBufferedReader,MyLineNumberReader)
*/
/*====第三题====================================
拷贝一个带内容的文件夹。
*/
/*====第四题====================================
编写一个程序,当用户输入一个目录时,
该程序能列出该目录下的所有子目录和文件。
*/
/*====第五题====================================
有五个学生,每个学生有3门课的成绩,定义一种比较直观的文本文件格式,
输入学生姓名和成绩,从键盘输入以上数据(包括姓名,三门课成绩),
按总分数从高到低的顺序将学生信息存放在磁盘文件"stu.txt"中。
*/
/*====第六题====================================
取出D:盘下全部的.java文件的文件路径保存在java.txt文件中
*/
/*====第七题====================================
计算字符串中子串出现的位置,
例:子串"kk"在字符串abkkcdkkabkkefkk中出现的次数
/*====第二题====================================
自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
能够在读取的每行前面都加上有行号和冒号。
提示:(MyBufferedReader,MyLineNumberReader)
*/
import java.io.*;
/*
自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
能够在读取的每行前面都加上有行号和冒号。
*/
class MyLineNumberReader
{
private Reader r;
int lineNum=0;
MyLineNumberReader( Reader r )
{
this.r=r;
lineNum=0;
}
public String readLine() throws Exception
{
StringBuffer sb=new StringBuffer();
int num=0;
while( (num=r.read())!=-1 )
{
if( num=='/r')
continue;
else if( num=='/n')
{
lineNum++;
return addLineNum( sb.toString() );
}
else
{
sb.append((char)num);
}
}
if( sb.length()>0 )
{
return sb.toString();
}
return null;
}
public String addLineNum( String s )
{
return lineNum+": "+s;
}
public void close() throws Exception
{
r.close();
}
}
class Demo
{
public static void main(String args[]) throws Exception
{
MyLineNumberReader my=new MyLineNumberReader( new FileReader("upLoadTxt.java"));
String s=null;
while( (s=my.readLine())!=null )
{
System.out.println( s );
}
}
}
/*====第三题====================================
拷贝一个带内容的文件夹。
*/
import java.io.*;
import java.util.*;
class CopyFile
{
String newFileDir; //新的路径
String srcFileDir; //原来的目录
String desFileDir; //新的目录
File srcFile;
CopyFile( String srcFileDir,String desFileDir )
{
this.srcFileDir=srcFileDir;
this.desFileDir=desFileDir;
srcFile=new File(srcFileDir);
}
public void start( ) throws Exception
{
getList( srcFile );
System.out.println( "d" );
}
private void getList( File f ) throws Exception
{
File fileList[]=f.listFiles();
for( int i=0; i<fileList.length; i++ )
{
if( fileList[i].isDirectory() )
{
copyDirectory( fileList[i] );
getList( fileList[i] ) ;
}
else
{
copyFile( fileList[i] );
}
}
}
private void copyDirectory( File f )
{
File desDirectory=new File( replacePath(f));
if( !(desDirectory.exists()))
{
desDirectory.mkdir();
}
//System.out.println( desDirectory.getAbsolutePath() );
}
private void copyFile( File f ) throws Exception
{
FileOutputStream fos=
new FileOutputStream( f );
File newFile=new File( replacePath(f ));
newFile.createNewFile();
FileInputStream fis=
new FileInputStream( newFile );
byte buf[]=new byte[1024];
int num=0;
while( (num=fis.read(buf))!=-1 )
{
fos.write(buf,0,num);
}
fos.close();
fis.close();
//System.out.println( replacePath(f ) );
}
private String replacePath( File f )
{
String s=f.getAbsolutePath();
System.out.println( s );
s=s.replace( srcFileDir,desFileDir );
System.out.println( desFileDir );
System.out.println( srcFileDir );
System.out.println( s );
System.out.println( " " );
return s;
}
}
class Demo
{
public static void main(String args[]) throws Exception
{
new CopyFile( "E://zjs//day22","D://zjs").start();
}
}
/*====第四题====================================
编写一个程序,当用户输入一个目录时,
该程序能列出该目录下的所有子目录和文件。
思路:
1,获取用户输入的目录,封装成文件对象。
a.获取输入可以有两种形式,一种通过System.in。另一种通过给主函数传值的形式。
b.把输入的字符串封装成File对象。对其进行判断。该文件夹是否存在。
2,通过递归的形式列出目录所有文件夹和文件
a.定义一个功能方法,遍历该文件夹对象,如果遍历到的File对象是文件夹就再次调用该功能方法(递归);
*/
import java.io.*;
class ListFile
{
private File myFile;
ListFile(String s)
{
myFile=new File(s);
}
public void startList()
{
getList( myFile,0 );
}
private void getList( File f,int num )
{
num++;
File fileList[]=f.listFiles();
for( int i=0; i<fileList.length; i++ )
{
if( fileList[i].isDirectory() )
{
System.out.println(
getSpace(num)+fileList[i].getName() );
getList( fileList[i],num );
}
else
{
System.out.println(
getSpace(num)+fileList[i].getName() );
}
}
}
private String getSpace( int num )
{
StringBuffer sb=new StringBuffer();
for( int i=0; i<num; i++ )
{
sb.append("|-");
}
return sb.toString();
}
}
class Demo
{
public static void main(String args[])
{
ListFile listFile=new ListFile("D://oracle");
listFile.startList();
}
}
/*====第五题====================================
有五个学生,每个学生有3门课的成绩,定义一种比较直观的文本文件格式,
输入学生姓名和成绩,从键盘输入以上数据(包括姓名,三门课成绩),
按总分数从高到低的顺序将学生信息存放在磁盘文件"stu.txt"中。
思路:
1,获取键盘录入;
a,System.in,为了更好读取键盘录入信息。一行一行的读会更方便,那么将其包装。
b,BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
2,将获取的键盘录入封装成学生对象(首先要对学生类进行描述。)
a,读到一行数据,通过该数据的规则(“,”)对数据进行切割。变成字符串数组。并把数组中的学生信息,作为参数,
封装成学生对象。
3,将风装好的学生对象存入集合中
(why?因为要对这些对象中的信息进行操作,用哪个集合呢?既然要排序。而且是存入单个对象。TreeSet,定义比较器。)
a.建立TreeSet集合,定一个比较器对象传给集合的构造函数。同过集合的add方法,将学生对象存入。
4,对已有元素的TreeSet集合,进行迭代。将其中的学生信息通过流写入到一个文件中。
a.通过Iterator迭代器,迭代该集合。取出学生对象中要用的信息。作为字符串,用字符流对象(FileWriter)
将其写入到一个文件中。
*/
import java.io.*;
import java.util.*;
class Student implements Comparable<Student>
{
private String name; //姓名
private double chineseGrade; //语文
private double mathGrade; //数学
private double enGrade; //英语
private double sum; //总成绩
Student( String name,
double chineseGrade,
double mathGrade,
double enGrade )
{
this.name=name;
this.chineseGrade=chineseGrade;
this.mathGrade=mathGrade;
this.enGrade=enGrade;
sum=chineseGrade+mathGrade+enGrade;
}
//获取学生信息
public String getName()
{
return name;
}
//获取学生总成绩
public double getSum()
{
return sum;
}
//使类具备比较功能
public int compareTo( Student s )
{
int num=0;
if( this.getSum()>s.getSum() )
{
num=1;
}
else if( this.getSum()==s.getSum() )
{
return this.name.compareTo(s.name);
}
else
{
num=-1;
}
return num;
}
}
//信息处理类,输入学生信息并保存到文件stu.txt上
class InfoDeal
{
private TreeSet<Student> set; //保存学生对象的集合并自动排序
InfoDeal()
{
set=new TreeSet<Student>();
}
public void start()
{
//从键盘上输入学生的信息
inputInfo();
//将学生信息存放在磁盘文件"stu.txt"中
saveInfoToFile();
}
//从键盘上输入学生的信息
public void inputInfo()
{
BufferedReader br=new BufferedReader(
new InputStreamReader( System.in ) );
String s=null;
String info[]=null;
try
{
//输入的格式为“学生,语文,数学,英语”
while( (s=br.readLine())!=null )
{
//输入quit后就表示退出
if( s.equals("quit") )
{
break;
}
info=s.split( "," );
/*
System.out.println( info[0] );
System.out.println( Double.parseDouble(info[1]) );
System.out.println( Double.parseDouble(info[2]) );
System.out.println( Double.parseDouble(info[3]) );
*/
//把学生信息存放在集合中
setStudentInfo( info[0],
Double.parseDouble(info[1]),
Double.parseDouble(info[2]),
Double.parseDouble(info[3]) );
}
}
catch( Exception e )
{
e.printStackTrace();
return;
}
}
//将学生信息存放在磁盘文件"stu.txt"中
public void saveInfoToFile()
{
BufferedWriter bw=null;
Iterator<Student> i;
Student stud=null;
try
{
bw=new BufferedWriter( new FileWriter( "stud.txt" ) );
i=set.iterator();
while( i.hasNext() )
{
stud=i.next();
//把信息保存到文件中
bw.write( stud.getName()+": "+stud.getSum() );
bw.newLine();
bw.flush();
}
}
catch( IOException e )
{
e.printStackTrace();
}
finally
{
//关闭输入流
if( bw!=null )
{
try
{
bw.close();
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
}
//把学生信息保存到集合中
public void setStudentInfo( String name,
double chineseGrade,
double mathGrade,
double enGrade )
{
set.add( new Student( name,
chineseGrade,
mathGrade,
enGrade ) );
}
}
class Demo
{
public static void main( String args[] )
{
new InfoDeal().start();
}
}
/*====第六题====================================
取出D:盘下全部的.java文件的文件路径保存在java.txt文件中
思路:
1.通过递归的方式遍历d:盘.判断文件的扩展名是否是以.java结尾.
2,把符合条件的File对象都存入到集合中.
3,遍历该集合.通过输出流把文件对象的getAbsolutePath写入到java.txt文件中.
(不存入集合直接写是可以的,但最好临时存储一下.这样就可以对所有的.java文件进行更多的其他操作.)
*/
import java.io.*;
import java.util.*;
class ListFile
{
private File myFile;
BufferedWriter fw;
TreeSet<File> set;
ListFile(String s)
{
myFile=new File(s);
set=new TreeSet<File>();
}
public void startList() throws Exception
{
fw=new BufferedWriter(new FileWriter("java.txt"));
getList( myFile,0 );
printPath();
fw.close();
}
private void getList( File f,int num )
{
num++;
File fileList[]=f.listFiles();
for( int i=0; i<fileList.length; i++ )
{
if( fileList[i].isDirectory() )
{
getList( fileList[i],num );
}
else
{
if( fileList[i].getName().endsWith(".java"))
{
set.add( fileList[i]);
}
}
}
}
private void printPath()throws Exception
{
Iterator<File> i=set.iterator();
File f;
while( i.hasNext())
{
f=i.next();
fw.write(f.getAbsolutePath());
fw.newLine();
}
}
}
class Demo
{
public static void main(String args[]) throws Exception
{
ListFile listFile=new ListFile("D://day22");
listFile.startList();
}
}
/*====第七题====================================
计算字符串中子串出现的位置,
例:子串"kk"在字符串abkkcdkkabkkefkk中出现的次数
思路:
1,既然是操作字符串就要先想到String类中是否提供相关方法.
2,可以先通过indexOf索引子串第一次出现的位置.第二次在索引的时候,就应该从第一次出现的位置+子串的长度后在从剩下的字符串中查找还有没有该子串.那么需要定义一个变量将剩下的字符串记录一下.
3,该过程既然重复.就需要循环来做.循环条件即为:当indexOf索引返回-1时.停止循环.
*/
import java.util.*;
class Demo
{
public static void main(String args[] )
{
String s="abkkcdkkabkkefkk";
String findStr="kk";
int pos=-findStr.length();
TreeSet<Integer> set=new TreeSet<Integer>();
do
{
pos=s.indexOf( findStr,pos+findStr.length() );
if(pos!=-1)
{
set.add(pos);
}
}while(pos!=-1);
Iterator<Integer> i=set.iterator();
while( i.hasNext())
{
System.out.println(i.next());
}
}
}