After putting a competitive target of 259 before the Lankans, Indian bowlers skittled out the hosts for 212 in 46.3 overs.
With this win India pocketed the five-match series with one match to spare which is scheduled for Friday and avenged their Test series drubbing.
The Indian bowlers had their task cut out right from the word go as comebackman Munaf Patel (2/48) once again impressed with the new ball, scalping the first two wickets. Malinda Warnapura (0) was the first man to go without scoring after he was caught in front of the wicket by Munaf. However, TV replays showed the ball might have gone over the stumps.
Out-of-form Kumar Sangakkara (6), dropped to the No 3 position following his woeful run in the tournament, failed once again as he played on a Munaf delivery.
However, veteran Sanath Jayasuriya (60 of 52 balls) was at his explosive best and with skipper Mahela Jayawardene (16) he put up a crucial 74-run stand for the fourth wicket to steady the Lankan innings.
Jayasuriya's dominance can be gauged from the fact that in the 74-run partnership, Jayawardene contributed only six runs.
However, an important bowling change by Indian skipper Mahendra Singh Dhoni in the 17th over, bringing in offie Harbhajan Singh (3 for 40) in place of Praveen Kumar, saw Jayasuriya's downfall.
In the third ball of his first over, Harbhajan picked up the crucial wicket of Jayasuriya after the Lankan edged a turner and Suresh Raina made no mistake in the first slip and reacted sharply to pounce on the opportunity.
The Lankans received yet another blow when the in-form Jayawrdene was caught short off the crease by Virat Kohli following a terrible mix up with Chamara Kapugedera (30) to leave the hosts reeling at 106 for 4 in 24.3 overs.
Most of the Lankan middle-order batsmen got a start but failed to capitalise on that and kept losing wickets at regular intervals.
Next to go was Tillekeratne Dilshan (12), who was wrapped on the pads by Harbhajan in his seventh over which brought an end to his 25-run stand with Kapugedera, thereby exposing the Lankan tail.
Four overs later, Kapugedera followed suit after he was caught in front of the wicket by Yuvraj (2 for 53).
The Indian vice-captain made up for his batting failure with the ball as Vaas became his second victim. The Lankan pacer feel lbw to Yuvraj.
Thilan Thushara, soon after his arrival, tried to turn the fortunes for the Lankans with his big hitting. He clubbed Yuvraj for two consecutive sixes in the 38th over and made a quickfire 40 off 29 balls and was the last man to depart, caught by Raina off Zaheer Khan (1 for 27).
Dhoni's bowling changes seemed to work wonders for the visitors, as after being brought back into the attack, Harbhajan lured Nuwan with a doosra, only to see the Indian skipper completing an easy stumping.
Earlier, skipper Dhoni (71), Raina (76) and Kohli (54) struck half centuries before India got all out for 258 with two balls to spare.
For the hosts, Thushara took five wickets for 47 runs and India lost their last seven wickets for just 34 runs to be skittled out in 49.4 overs.
Having slumped to 81 for three, Raina and Dhoni took control of the situation and judiciously mixed cheeky singles with big shots forcing Sri Lanka skipper Jayawardene to rework his strategies.
The 143-run partnership between the two took India to a position of comfort from where on the remaining batsmen only had to score at a consistent rate.
Not allowing Ajantha Mendis to get into a rhythm, Raina decided to attack the bowler as he lofted his off-break to the long-off boundary.
With the onus of responsibility once again falling on Dhoni, the Indian captain tried to settled down quickly as he forced a Thushara delivery past the cover boundary.
Raina matched Dhoni's aggression and India raced to the 150 mark in 185 balls as the two decided to unnerve the Sri Lankan bowlers.
In no time, Raina reached a well-deserved half century -- his seventh -- in 56 balls as he came down the track and lofted Muttiah Muralitharan to the extra cover boundary.
His front-foot hit over the deep-midwicket boundary for a six of Murali was a beauty.
Dhoni got to his 50 in 60 balls and it included three boundaries.
A visibly tired Raina then tried to hit Thushara over the long off and was caught by Nuwan Kulasekara, his 76 runs coming off 78 balls and including six boundaries and one six.
Dhoni, playing with a runner, followed suit, caught by Jayasuriya at covers off Thushara for a well-compiled 71 runs.
Earlier, the Indian openers looked confident and after a cautious start, Kohli steered a swinging delivery from Kulasekara through the slip for four runs to get into the groove.
Partner Gautam Gambhir (17) preferred hitting the bowlers over the fielding cordon but he perished soon, slashing Kulasekara straight into the hands of Dilshan.
India got another rude jolt as Yuvraj, who was tentative right from the beginning, became Chaminda Vaas' 400th victim before he could even opened his account.
He was smartly caught by skipper Jayawardene at short mid-wicket as Yuvraj failed to keep the ball down.
An unperturbed Kohli, however, kept going and hit Kulasekara to the mid-wicket boundary on the way to his half-century.
His maiden 50 came in 81 minutes and 62 balls and included six hits to the boundary. He, however, could not stretch it further as Thushara castled him for 54.
S Badrinath, who was required to play a cameo in the dying overs, only managed six runs before Jayawardene caught him at short mid-wicket.
India lost wickets in a heap as Harbhajan was run out for two, while Rohit Sharma was caught by Warnapura off Ajantha Mendis for 18.
Thushara went on to complete his five-wicket haul by removing Praveen Kumar and Zaheer.