用Java编写文件的奇怪问题



启动程序时,需要3个名为input.txtdata.txtoutput.txt的参数。它将data.txt中歌曲的信息保存到LinkedList,并通过处理input.txt中的命令来执行操作。input.txt中的一些命令(如列表(将信息打印到output.txt文件中。

input.txt的内容:

Add id:12 name:"Sandik" singer:"Muslum Gurses" year:2009 count:5 price:20
Add id:15 singer:"Tarkan" name:"Adimi Kalbine Yaz" year:2010 count:10 price:20
Add id:20 name:"Fear of the Dark" singer:"Iron Maiden" year:1992 count:20 price:15
Add id:25 name:"Dark Side of the moon" singer:"Almora" year:1987 count:5 price:10
Remove id:12
List
Edit id:15 singer:"Tarkan Tevetoglu"
Search "ark"
Sell 20
List
Quit

data.txt的内容:

<id>; <price>; <name>; <singer>; <year>; <count>
15;20;Adimi Kalbine Yaz; Tarkan Tevetoglu;2010;10
12;20;Sandik;Muslum Gurses;2009;5
20;15;Fear of the Dark;Iron Maiden;1992;20

预期输出.txt:

New CD added id: 12 name:"Sandik"
New CD added id: 15 name:"Adimi Kalbine Yaz"
New CD added id: 20 name:"Fear of the Dark"
New CD added id: 25 name:"Dark Side of the moon"
CD removed id: 12

List (12 is removed)
Id   Price                     Name         Singer      Year      Count
-----------------------------------------------------------------------
15      20        Adimi Kalbine Yaz         Tarkan      2010         10
25      10    Dark Side of the moon         Almora      1984          5
20      20         Fear of the Dark    Iron Maiden      1992         20

Edit CD id: 15
Id   Price                     Name              Singer      Year      Count
----------------------------------------------------------------------------
15      20        Adimi Kalbine Yaz    Tarkan Tevetoglu      2010         10

Id   Price                     Name         Singer      Year      Count
-----------------------------------------------------------------------
15      20        Adimi Kalbine Yaz         Tarkan      2010         10
25      10    Dark Side of the moon         Almora      1984          5
20      20         Fear of the Dark    Iron Maiden      1992         20

Search "ark”
Id   Price                     Name         Singer      Year      Count
-----------------------------------------------------------------------
25      10    Dark Side of the moon         Almora      1984          5
20      20         Fear of the Dark    Iron Maiden      1992         20

CD sold id: 20
Id   Price                     Name         Singer      Year      Count
-----------------------------------------------------------------------
15      20        Adimi Kalbine Yaz         Tarkan      2010         10
25      10    Dark Side of the moon         Almora      1984          5
20      20         Fear of the Dark    Iron Maiden      1992         20

Quit
Cash: 20
Best Seller: Fear of the Dark

我的程序由两个类组成,MainLinkedList。我写了这个程序,一切都很好。然而,当程序正在开发时,我正在控制台上做实验。我完成了这个程序,当我把打印部件改为打印到文件而不是控制台时,我的程序爆炸了。在解释导致问题的部分之前,我想分享我的代码。

主要类别:

import java.io.*;
import java.util.Scanner; // Import the Scanner class to read text files

public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
//FileWriter myWriter = new FileWriter(args[2]);
PrintStream output1 = new PrintStream(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!"\w")\s+(?!\w+")"); //Alternate Solution
String[] parts = data.split("\s(?=\w+:)");
String[] parts1 = data.split("(?<!"\w")\s+(?!\w+")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1);                //DONE!
output1.print("New CD added id: "+id1+" name: "+name1);
output1.println();
}
case "Search" -> {
output1.print("List:n");
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey);
output1.println();
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1));                  //DONE!
output1.print("CD removed id: "+id1);
output1.println();
}
case "List" -> {
output1.print("List:n");
LinkedList.printList(list);
output1.println();
}
case "Edit" -> {
output1.print("Edit CD id: "+id1);
output1.println();
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1);
case "name" -> LinkedList.editName(list, id1, name1);
case "year" -> LinkedList.editYear(list, id1, year1);                         //DONE!
case "count" -> LinkedList.editCount(list, id1, count1);
case "price" -> LinkedList.editPrice(list, id1, price1);
}
output1.println();
}
case ("Sell") -> {
LinkedList.sell(list,id1);
output1.print("CD Sold. ID: "+id1);                                                //DONE!
output1.println();
}
case "Quit" -> {
output1.print("Quit");
output1.println();
output1.print("Cash :"+LinkedList.cash);
output1.println();
}
}
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
output1.close();
}
}

LinkedList类:

import java.io.IOException;
import java.io.PrintStream;
public class LinkedList {
Node head; // head of list
public String[] args;
static PrintStream output = null;
public LinkedList(String[] args) throws IOException {
this.args = args;
output = new PrintStream(args[2]);
}
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list)
{
Node currNode = list.head;
output.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
output.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
output.println();
}
output.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next;   // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next;  // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a)
{
Node current = list.head;    //Initialize current
output.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
output.println("n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
output.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
output.println();
}
current = current.next;
}
}
}

当我运行程序时,打印到output.txt文件的输出不正确,我对其进行了调试。当我的程序进入开关结构时,读取了第一个命令add并执行了操作,一切都很好。直到读取List命令。List命令之前的所有命令都工作正常,一切都很好,但当读取List时,LinkedList类中的printList函数工作正常。这一行一运行,我的output.txt文件就会损坏。output.printf ("% s% 10s% 30s% 25s% 15s% 10s", "ID", "Price", "Name", "Singer", "Year", "Count");

每次运行LinkedList类中的output.print命令时,我的output.txt文件都会进一步损坏。我认为问题可能是由两个单独的对象在同一个文件上写入引起的。我不确定,但它们可能有冲突。我该如何解决这个问题,或者有更实用的方法吗?如果你能帮忙,我将不胜感激。提前谢谢。

例如,我通过将在Main中创建的名为output1的对象发送到读取add命令时将调用的函数,并在LinkedList类中使用它来解决问题。

LinkedList类:

import java.io.*;
public class LinkedList {
Node head; // head of list
public String[] args;
public LinkedList(String[] args){
this.args = args;
}
static class Node {
int id;
int year;
int count;
int price;
String name;
String singer;
Node next;
// Constructor
Node(int i, int p, String n, String s, int y, int c) {
id = i;
year = y;
count = c;
price = p;
name = n;
singer = s;
next = null;
}
}
public static LinkedList insert(LinkedList list, int i,int p, String n, String s, int y,int c)
{
// Create a new node with given data
Node new_node = new Node(i,p,n,s,y,c);
new_node.next = null;
// If the Linked List is empty,
// then make the new node as head
if (list.head == null) {
list.head = new_node;
}
else {
// Else traverse till the last node
// and insert the new_node there
Node last = list.head;
while (last.next != null) {
last = last.next;
}
// Insert the new_node at last node
last.next = new_node;
}
// Return the list by head
return list;
}
public static void printList(LinkedList list, PrintStream x)
{
Node currNode = list.head;
x.printf("%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
x.println("n-------------------------------------------------------------------------------------------------");
// Traverse through the LinkedList
while (currNode != null) {
// Print the data at current node
x.printf("%s %10s %30s %25s %15s %10s", currNode.id, currNode.price, currNode.name, currNode.singer, currNode.year, currNode.count);
// Go to next node
currNode = currNode.next;
x.println();
}
x.println();
}
public static void deleteNode(LinkedList list ,int position)
{
// If linked list is empty
if (list.head == null)
return;
// Store head node
Node temp = list.head;
// If head needs to be removed
if (position == 0)
{
list.head = temp.next;   // Change head
return;
}
// Find previous node of the node to be deleted
for (int i=0; temp!=null && i<position-1; i++)
temp = temp.next;
// If position is more than number of nodes
if (temp == null || temp.next == null)
return;
// Node temp->next is the node to be deleted
// Store pointer to the next of node to be deleted
Node next = temp.next.next;
temp.next = next;  // Unlink the deleted node from list
}
static int search = 0;
static int cash = 0;
public static int searchPosition(LinkedList list, int x)
{
search = 0;
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
break;
}
current = current.next;
search++;
}
return search;
}
public static int sell(LinkedList list, int x)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
cash = cash + current.price;
break;
}
current = current.next;
}
return cash;
}
public static void editName(LinkedList list, int x, String a, PrintStream y)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.name = a;
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editSinger(LinkedList list, int x, String a, PrintStream y)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.singer = a;
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editYear(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.year = a;
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editCount(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.count = a;
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void editPrice(LinkedList list, int x, int a, PrintStream y)
{
Node current = list.head;    //Initialize current
while (current != null)
{
if (current.id == x){
current.price = a;
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
break;
}
current = current.next;
}
}
public static void searchAndFind(LinkedList list, String a, PrintStream y)
{
Node current = list.head;    //Initialize current
y.printf("nn%s %10s %30s %25s %15s %10s", "ID", "Price", "Name", "Singer", "Year", "Count");
y.println("n-------------------------------------------------------------------------------------------------");
while (current != null)
{
if (current.name.contains(a)){
y.printf("%s %10s %30s %25s %15s %10s", current.id, current.price, current.name, current.singer, current.year, current.count);
y.println();
}
current = current.next;
}
}
}

主要类别:

import java.io.*;
import java.util.Scanner; // Import the Scanner class to read text files

public class Main {
public static void main(String[] args) throws IOException {
int i = 0;
/* Start with the empty list. */
LinkedList list = new LinkedList(args);
int id1 = 0,year1 = 0,count1 = 0,price1 = 0;
String name1 = "",singer1 = "";
//The contents of data.txt have been loaded into the program.
try {
Scanner scan = new Scanner(new File(args[1]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
String[] readedData = data.split(";");
LinkedList.insert(list,id1 = Integer.parseInt(readedData[0]),price1 = Integer.parseInt(readedData[1]),name1 = readedData[2],singer1 = readedData[3],year1 = Integer.parseInt(readedData[4]),count1 = Integer.parseInt(readedData[5]));
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
//The object required to write to the file has been created.
//FileWriter myWriter = new FileWriter(args[2]);
PrintStream output1 = new PrintStream(args[2]);
//The input.txt file has started to be read.
try {
Scanner scan = new Scanner(new File(args[0]));
while (scan.hasNextLine()) {
String data = scan.nextLine();
// First, split on whitespace
//String[] parts = data.split("(?<!"\w")\s+(?!\w+")"); //Alternate Solution
String[] parts = data.split("\s(?=\w+:)");
String[] parts1 = data.split("(?<!"\w")\s+(?!\w+")");
String command1 = parts1[0];
// The first element in the array is the command
String command = parts[0];
// Split the remaining elements on ':'
String[] keyVal;
String key = " ";
String value= " ";
for (i = 1; i < parts.length; i++) {
keyVal = parts[i].split(":");
if (keyVal.length == 2) {
key = keyVal[0];
value = keyVal[1];
switch (key) {
case "id" -> id1 = Integer.parseInt(value);
case "name" -> name1 = value.substring(1, value.length() - 1);
case "singer" -> singer1 = value.substring(1, value.length() - 1);
case "year" -> year1 = Integer.parseInt(value);
case "count" -> count1 = Integer.parseInt(value);
case "price" -> price1 = Integer.parseInt(value);
}
}
}
switch (command1) {
case "Add" -> {
LinkedList.insert(list, id1, price1, name1, singer1, year1, count1);                //DONE!
output1.print("New CD added id: "+id1+" name: "+name1);
output1.println();
}
case "Search" -> {
output1.print("List:n");
String[] key1 = command.split(" ");
String SearchKey = key1[1];
SearchKey = SearchKey.substring(1, SearchKey.length() - 1);
LinkedList.searchAndFind(list,SearchKey,output1);
output1.println();
}
case "Remove" -> {
LinkedList.deleteNode(list,LinkedList.searchPosition(list,id1));                  //DONE!
output1.print("CD removed id: "+id1);
output1.println();
}
case "List" -> {
output1.print("List:n");
LinkedList.printList(list,output1);
output1.println();
}
case "Edit" -> {
output1.print("Edit CD id: "+id1);
output1.println();
switch (key) {
case "singer" -> LinkedList.editSinger(list, id1, singer1,output1);
case "name" -> LinkedList.editName(list, id1, name1,output1);
case "year" -> LinkedList.editYear(list, id1, year1,output1);                         //DONE!
case "count" -> LinkedList.editCount(list, id1, count1,output1);
case "price" -> LinkedList.editPrice(list, id1, price1,output1);
}
output1.println();
}
case ("Sell") -> {
LinkedList.sell(list,id1);
output1.print("CD Sold. ID: "+id1);                                                //DONE!
output1.println();
}
case "Quit" -> {
output1.print("Quit");
output1.println();
output1.print("Cash :"+LinkedList.cash);
output1.println();
}
}
}
scan.close();
} catch (FileNotFoundException e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
output1.close();
}
}

相关内容

  • 没有找到相关文章

最新更新