2013-02-22 3 views
0

je besoin d'aide avec les pièces suivantes que je connais ont tort: ​​Création du fichier aléatoire d'accès pour la Banque

  1. Les espaces/tronquer - Je ne sais pas comment faire
  2. Le file.seek - Probablement mal car je ne suis pas espacer/tronquer à 8 caractères.

Voici mon code:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.RandomAccessFile; 

public class NationalBank 
{ 
    public static void main(String[] args) 
    { 
    InputStreamReader temp = null; 
    BufferedReader input = null; 
    try 
    { 
    temp = new InputStreamReader(System.in); 
    input = new BufferedReader(temp); 
    int acct; 
    double amount[] = new double[9999]; 
    String name[] = new String[9999]; 
    RandomAccessFile file = new RandomAccessFile("bank.txt", "rw"); 
    while(true) 
    { 
     System.out.println("Enter Account Number (0-9999): "); 
     acct = Integer.parseInt(input.readLine()); 
     System.out.println("Enter Last Name: "); 
     name[acct] = input.readLine(); 
     System.out.println("Enter Balance "); 
     amount[acct] = Double.parseDouble(input.readLine()); 
     if(acct >=0 && acct <=9999) { 
      file.seek(acct*10); 
      file.writeBytes(" "+name[acct]); 
      file.writeBytes(" "+amount[acct]); 
     } 

     System.out.println("Enter More? (y/n)"); 
     if (input.readLine().toLowerCase().equals("n")) 
      break; 
    } 
    file.close(); 
    } 
    catch (Exception e) 
    { 
    } 
    } 
} 
+0

Ah, la base de données? Je pense à beaucoup de bases de données mono-utilisateur disponibles [HyperSQL] (http://hsqldb.org/) et [H2] (http://www.h2database.com/html/main.html). – MadProgrammer

+0

@MadProgrammer - Je suis sûr que c'est un exercice de quelque sorte. – Perception

+0

Vous multipliez par 10 et le nom utilise 8 octets, alors comment vont aller le montant en 2 octets? –

Répondre

1
/** 
* Convert name from string into 8 bytes truncating and padding with spaces 
* id necessary. 
*/ 
public static byte [] truncateName (String name) 
{ 
    byte [] result = new byte [8]; 
    for (int i = 0; i < 8; i++) 
     result [i] = i < name.length() ? (byte)name.charAt (i) : (byte)' '; 
    return result; 
} 

/** 
* Convert double value into 8 bytes. 
*/ 
public static byte [] packAmount (double amount) 
{ 
    byte [] result = new byte [8]; 
    long bits = Double.doubleToLongBits (amount); 

    for (int i = 0; i < 8; i++) 
    { 
     result [i] = (byte)(bits & 0xFF); 
     bits >>>= 8; 
    } 

    return result; 
} 

public static void writeAccountinformation (
    RandomAccessFile file, int account, String name, double amount) 
    throws IOException 
{ 
    file.seek (account * 16); // 8 bytes for name and another 8 for amount 
    file.write (truncateName (name)); 
    file.write (packAmount (amount)); 
} 

public static void main(String[] args) throws Exception 
{ 
    RandomAccessFile file = new RandomAccessFile ("bank.txt", "rw"); 
    try 
    { 
     BufferedReader reader = new BufferedReader (
      new InputStreamReader (System.in)); 

     while (true) 
     { 
      System.out.print ("Enter Account Number (0-9999): "); 
      int account = Integer.parseInt (reader.readLine()); 
      System.out.print ("Enter Last Name: "); 
      String name = reader.readLine(); 
      System.out.print ("Enter Balance: "); 
      double amount = Double.parseDouble (reader.readLine()); 

      writeAccountinformation (file, account, name, amount); 

      System.out.println ("Enter More? (y/n)"); 
      if (reader.readLine().toLowerCase().equals ("n")) 
       break; 
     } 
    } 
    finally 
    { 
     file.close(); 
    } 
} 

plus tard vous pouvez lire des données depuis le fichier comme ceci:

FileInputStream input = new FileInputStream ("bank.txt"); 
try 
{ 
    byte [] record = new byte [16]; 
    while (input.read (record) == 16) 
    { 
     String name = new String (record, 0, 8); 
     long bits = 0L; 
     for (int i = 15; i >= 8; i--) 
     { 
      bits <<= 8; 
      bits |= record [i] & 0xFF; 
     } 
     double amount = Double.longBitsToDouble (bits); 

     System.out.println("Name: " + name + ", amount: " + amount); 
    } 
} 
finally 
{ 
    input.close(); 
} 
+0

Donc je n'ai même pas besoin d'un tableau? – Acitropy

+0

Comment ferais-je alors Si je devais faire une autre application qui affiche tous les comptes avec un nom de famille valide et solde? – Acitropy

+0

@ user1913362 Extrait de code ajouté qui lit les données. –

Questions connexes